вставить в таблицу, где столбец увеличивается на 1 по сравнению с другими строками тех же данных

#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 значением на время транзакции.