Пользовательская переменная в запросе INSERT для MySQL

Мне нужно использовать определяемую пользователем переменную в запросе INSERT для MySQL, см. пример ниже:

INSERT INTO `posts`(`id`) VALUES(NULL);
SET @last_insert_id = LAST_INSERT_ID();
INSERT INTO `comments`(`id`, `post_id`) VALUES(NULL, "@last_insert_id");

Этот пример не работает и вставил 0. Что я делаю не так?


person Igor Timoshenko    schedule 22.05.2012    source источник


Ответы (1)


Нет необходимости хранить его в переменной. Вы можете просто вызвать LAST_INSERT_ID() внутри следующего оператора INSERT.

INSERT INTO `comments`(`id`, `post_id`) VALUES (NULL, LAST_INSERT_ID());

... если у вас нет нескольких вставок для выполнения с использованием этого идентификатора.

В этом случае правильный синтаксис для использования переменной — без кавычек:

INSERT INTO `posts`(`id`) VALUES (NULL);
SET @last_insert_id = LAST_INSERT_ID();
/* Several new entries using the same @last_insert_id */
INSERT INTO `comments`(`id`, `post_id`) VALUES (NULL, @last_insert_id);
INSERT INTO `comments`(`id`, `post_id`) VALUES (NULL, @last_insert_id);
INSERT INTO `comments`(`id`, `post_id`) VALUES (NULL, @last_insert_id);
INSERT INTO `comments`(`id`, `post_id`) VALUES (NULL, @last_insert_id);
INSERT INTO `comments`(`id`, `post_id`) VALUES (NULL, @last_insert_id);
person Michael Berkowski    schedule 22.05.2012
comment
Мне нужно использовать определяемую пользователем переменную. Выше был простой пример. - person Igor Timoshenko; 22.05.2012
comment
достаточно ли это последовательно, я имею в виду, что если кто-то другой или cron делает некоторые вставки, будет SET @last_insert_id = LAST_INSERT_ID(); берет последний id из какого автоинкремента какой таблицы?! - person shareef; 22.10.2017
comment
@shareef LAST_INSERT_ID() возвращает значение последнего идентификатора, вставленного из текущего подключения к базе данных. Другой пользователь, другой cron или что-то подобное будет работать с другим соединением с базой данных со своими собственными значениями last_insert_id, и поэтому значения будут согласованными. - person Michael Berkowski; 22.10.2017