Синтаксис MySQL для вставки новой строки в средние строки? - PullRequest
17 голосов
/ 13 июня 2011

синтаксис mysql для вставки новой строки в средние строки или в любое другое место без обновления существующей строки, но с автоматическим увеличением первичного ключа (id)?

' id | value
' 1  | 100
' 2  | 200
' 3  | 400
' 4  | 500

Я хочу вставить новую строку послеid 2, со значением = 300. Я хочу вывод, как показано ниже:

' id | value
' 1  | 100
' 2  | 200
' 3  | 300  <-- new row with id (automatic increment)
' 4  | 400  <-- id=id+1
' 5  | 500  <-- id=id+1 

Спасибо.

Ответы [ 3 ]

34 голосов
/ 13 июня 2011

Вам придется разделить его на 2 операции.

START TRANSACTION;

UPDATE table1 SET id = id + 1 WHERE id >= 3 order by id DESC;

INSERT INTO table1 (id, value) VALUES (3, 300);

COMMIT;

Обратите внимание, что вам нужно order by в операторе обновления, чтобы он сначала начинался с самых высоких идентификаторов.

Другой идеей было бы объявить id как decimal(10,1) и вставить значение 2.5 в качестве идентификатора между 2 и 3.

0 голосов
/ 13 июня 2011

Вы не можете использовать функцию автоинкремента для новой строки.Следующее значение автоинкремента всегда будет после последнего сгенерированного значения автоинкремента;никогда не промежуточное значение.Единственный способ сделать это довольно болезненный: вставить новую строку, которая является копией последней строки (чтобы увеличить число автоинкрементов для таблицы), а затем обновить все оставшиеся строки (включая ту, которую вы считаетеновый).

Если значения уникальны, я задаюсь вопросом о целесообразности использования отдельного столбца id.Почему бы не сделать столбец value первичным ключом?

0 голосов
/ 13 июня 2011
insert into my_table (value)
values (select value+100 from my_table order by id desc limit 1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...