INSERT не работает, если за ним следует SELECT LAST_INSERT_ID

Есть много вопросов по LAST_INSERT_ID()

В моем случае проблема:

Когда за INSERT следует SELECT LAST_INSERT_ID(), записи не вставляются

INSERT INTO sequences (state)  VALUES (0);
select LAST_INSERT_ID();
>>> 80  // nothing is added to DB

INSERT сам по себе работает нормально

INSERT INTO sequences (state)  VALUES (0);
>>>
select LAST_INSERT_ID();
>>> 81 // row is inserted

Для тестирования я использую SequelPro, DB — это Amazon RDS MySQL. Та же проблема возникает, когда я использую модуль Python MySQLdb.

В идеале я хочу вставить строку, вернуть ее идентификатор для будущей идентификации и использования.

Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
3
0
97
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы должны запускать один запрос за раз. Большинство интерфейсов SQL не допускают множественных запросов.

MySQL позволяет завершить один запрос с помощью ;, но если после ; есть какие-либо слова (кроме комментария), это будет синтаксическая ошибка, которая приведет к сбою всего запроса. Так что INSERT тоже не запустится.

В MySQL есть опция подключения, позволяющая выполнять множественные запросы, но по умолчанию она не активна. См. https://dev.mysql.com/doc/refman/8.0/en/c-api-multiple-queries.html

На самом деле нет причин использовать множественный запрос. Просто запустите SELECT LAST_INSERT_ID() как отдельный запрос после INSERT. Пока вы используете одно и то же соединение, оно даст вам правильный ответ.

Создаст ли это условия для гонки? Я запускаю более 400 узлов параллельно, что, если один узел INSERT сразу после другого

aaaaa says reinstate Monica 07.03.2019 23:36

@aaaaaa почему ты все еще сомневаешься? LAST_INSERT_ID() является потокобезопасным, он основан на соединении. руководство говорит: «Такое поведение гарантирует, что каждый клиент может получить свой собственный идентификатор, не заботясь о действиях других клиентов и без необходимости блокировок или транзакций». все будет в порядке, когда все узлы используют одно и то же соединение или отдельные соединения, и не забыть условия гонки бесплатно

Raymond Nijland 07.03.2019 23:45

Да, LAST_INSERT_ID() относится к вашему сеансу. Если бы это было не так, никому бы не было пользы! Кроме того, если бы он не был потокобезопасным, то объединение его с INSERT в один мультизапрос не помогло бы. Это все равно будет зависеть от условий гонки.

Bill Karwin 08.03.2019 00:03

Другие вопросы по теме