#php #mysql #sql
#php #mysql #sql
Вопрос:
По сути, у меня будет таблица с такими данными, как
id, parent_id, child number
1, 5, 1
2, 5, 2
3, 5, 3
4, 5, 4
5, 6, 1
6, 6, 2
Что мне нужно, так это SQL-запрос, который мог бы добавить строку, представляющую нового дочернего элемента родительского идентификатора 5, поэтому было бы сказано что-то вроде
INSERT INTO `table` (`parent_id`)
VALUES ('5')
SET `child_number` = 1 MAX(`child_number`) WHERE `parent_id` = '5'
Но я сомневаюсь, что этот sql будет работать.
Любая помощь была бы высоко оценена, спасибо.
Комментарии:
1. Не могли бы вы выразиться немного яснее, вставка строки с родительским идентификатором 5 кажется довольно простой, не так ли?
2. Предоставленные 2 ответа в значительной степени попали в точку, судя по всему
3. Что вы планируете делать с этой информацией? Это то, что было бы лучше выведено? Что произойдет, если строка будет удалена — нужно ли обновлять все «большие»
child number
значения?4. @Clockwork-Muse Новый дочерний номер всегда должен быть на 1 больше, чем наибольшее существующее дочернее число для этого родительского идентификатора, но не имеет значения, будет ли удален какой-либо из меньших, удаление или обновление любой строки в таблице не должно требовать взаимодействия с какой-либо другой строкой, пока они остаются уникальными.
5. Если вы допускаете пробелы, то зачем каждому
parent_id
нужна своя последовательность? Для чего вы используете эту информацию? Почему вы не могли просто использоватьid
столбец и объявить, что там было много «предварительно удаленных» строк?
Ответ №1:
Вы можете использовать запрос insert, подобный этому:
INSERT INTO TABLE (PARENT_ID, CHILD_NUMBER)
VALUES
('5', (SELECT MAX(CHILD_NUMBER) 1 FROM TABLE WHERE PARENT_ID= '5') );
Комментарии:
1. Спасибо, выглядит неплохо. Я чувствую, что должен был быть в состоянии понять это, но мой мозг не работал.
2. @Merry — Обратите внимание, что это должно сериализовать вставки в эту таблицу, иначе вы можете получить повторяющиеся значения. Если у вас есть уникальный ключ, который включает столбец, вы не получите повторяющихся значений, но для этого потребуется повторная попытка вставки. Это решение, как минимум, заблокирует все записи с заданным
PARENT_ID
значением на время транзакции.
Ответ №2:
Вы могли бы сделать что-то вроде этого:
INSERT INTO `table` SET
`parent_id` = '5',
`child_number` = (SELECT MAX(`child_number`) FROM `table` WHERE `parent_id` = '5') 1
Комментарии:
1. @Merry — Обратите внимание, что это должно сериализовать вставки в эту таблицу, иначе вы можете получить повторяющиеся значения. Если у вас есть уникальный ключ, который включает столбец, вы не получите повторяющихся значений, но для этого потребуется повторная попытка вставки. Это решение, как минимум, заблокирует все записи с заданным
PARENT_ID
значением на время транзакции.