MySQL: используйте идентификатор вставляемой строки в самом операторе вставки - PullRequest
7 голосов
/ 29 октября 2009

Я пытаюсь что-то в этом роде:

INSERT INTO dir_pictures SET filename=CONCAT(picture_id,'-test');

picture_id - мой первичный ключ, автоинкремент. Обычно я пытаюсь указать идентификатор этого оператора вставки в самом операторе.

Я уверен, что это можно сделать с помощью некоторого дополнительного кода PHP или с использованием более чем одного оператора, но мне было интересно, есть ли быстрый и простой способ сделать это за один раз.

PS. В приведенном выше утверждении всегда ставится «0-критерий»

Ответы [ 5 ]

10 голосов
/ 29 октября 2009

Сначала вставьте запись. Затем разделите ваши операторы точкой с запятой и используйте LAST_INSERT_ID () , чтобы получить недавно вставленный идентификатор автоинкремента. Выполните за один раз.

insert into dir_pictures .... ; 
update dir_pictures set filename=CONCAT(LAST_INSERT_ID(),'-test') where id = LAST_INSERT_ID()
3 голосов
/ 29 октября 2009

Просто выберите текущее значение auto_increment для таблицы из таблицы information_schema как часть вставки:

INSERT INTO dir_pictures SET filename=CONCAT((SELECT auto_increment FROM
information_schema.tables WHERE table_name='dir_pictures'), '-test')
0 голосов
/ 29 октября 2009

Если вы действительно хотите сделать это в одном операторе SQL, вы можете попробовать взломать как:

INSERT INTO dir_pictures SET filename=CONCAT((select max(picture_id)+1 from dir_pictures),'-test');

Остерегайтесь условий гонки, если это многопоточное приложение ...

Кроме того, я сомневаюсь, что это сработает на пустом столе ...

0 голосов
/ 29 октября 2009

Это на самом деле невозможно, вероятно, в ваших же интересах было бы просто конкатенировать его при выходе, а не при входе.

SELECT CONCAT (id, '-text') в качестве имени файла FROM dir_pictures

0 голосов
/ 29 октября 2009

Ну, вы не узнаете идентификатор строки, пока вставка не завершится ... так что, я не думаю, что это когда-нибудь сработает!

Почему бы просто не вычислить имя файла при извлечении строки?

INSERT INTO dir_pictures (file_extension) VALUES ('-data')

SELECT picture_id, CONCAT(picture_id, file_extension) as filename
FROM dir_pictures
...