Могу ли я получить lastInsertId из массовой вставки? - PullRequest
4 голосов
/ 17 сентября 2009
INSERT INTO details (idactivity,user,hours,val,date) VALUES ('981','133','0','10500','2008-07-01'),('981','184','0','2750','2008-07-01'),('981','184','0','2750','2008-07-01')

(подробности в виде таблицы данных PK)

Есть ли способ получить 3 новых идентификатора и передать их в следующий запрос массовой вставки?

INSERT INTO activity (idactivity,iddetails) VALUES('981',??),('981',??),('981',??)

Ответы [ 6 ]

6 голосов
/ 17 сентября 2009

Подробное обсуждение поведения last_insert_id () с многострочными операторами вставки в руководстве по MySQL. Прокрутите немного вниз к части с красной вертикальной полосой, начинающейся со слова "важный".

3 голосов
/ 17 сентября 2009

Я думаю, что вы должны делать начальные вставки по одной за раз. Last_insert_id в MySQL просто даст вам идентификатор первого элемента, который вы вставляете, с помощью многострочного оператора вставки, подобного этому. Могут возникнуть проблемы, если у вас есть несколько процессов, вставляющих строки одновременно.

Однако (и я не проверял это), если вы используете таблицы InnoDB, тогда оператор должен выполняться в неявной транзакции, поэтому вы должны быть в состоянии предположить, что сгенерированные идентификаторы были последовательными.

Другой способ, опять же, если у вас есть транзакции, это заблокировать таблицу и вручную обновить ее свойство AUTO_INCREMENT. Если у вас есть, например, 50 строк для вставки, то увеличьте их на 50. Затем разблокируйте таблицу и вставьте строки, явно используя зарезервированные вами идентификаторы. Для этого вам понадобятся переходы (или, по крайней мере, блокировки таблиц), чтобы вы не читали AUTO_INCREMENT, а затем кто-то вставил новую строку перед ее обновлением.

2 голосов
/ 17 сентября 2009

Насколько я знаю, не в mysql.

0 голосов
/ 18 сентября 2009

Использование SELECT last_insert_id ();запрос вы можете получить последний вставленный идентификатор.

0 голосов
/ 17 сентября 2009

Вы можете добавить поле базы данных для GUID и хранить случайное поле с каждой записью. тогда другой запрос может извлечь идентификаторы

0 голосов
/ 17 сентября 2009

Если вы используете дату и время вместо просто даты, вы можете искать вставленный идентификатор, основываясь на значениях пользователя и даты и времени, но, вероятно, лучше не делать массовую вставку, если вам нужны эти данные. В противном случае вы все равно будете выполнять больше запросов.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...