Есть много вопросов по 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.
В идеале я хочу вставить строку, вернуть ее идентификатор для будущей идентификации и использования.






Вы должны запускать один запрос за раз. Большинство интерфейсов SQL не допускают множественных запросов.
MySQL позволяет завершить один запрос с помощью ;, но если после ; есть какие-либо слова (кроме комментария), это будет синтаксическая ошибка, которая приведет к сбою всего запроса. Так что INSERT тоже не запустится.
В MySQL есть опция подключения, позволяющая выполнять множественные запросы, но по умолчанию она не активна. См. https://dev.mysql.com/doc/refman/8.0/en/c-api-multiple-queries.html
На самом деле нет причин использовать множественный запрос. Просто запустите SELECT LAST_INSERT_ID() как отдельный запрос после INSERT. Пока вы используете одно и то же соединение, оно даст вам правильный ответ.
@aaaaaa почему ты все еще сомневаешься? LAST_INSERT_ID() является потокобезопасным, он основан на соединении. руководство говорит: «Такое поведение гарантирует, что каждый клиент может получить свой собственный идентификатор, не заботясь о действиях других клиентов и без необходимости блокировок или транзакций». все будет в порядке, когда все узлы используют одно и то же соединение или отдельные соединения, и не забыть условия гонки бесплатно
Да, LAST_INSERT_ID() относится к вашему сеансу. Если бы это было не так, никому бы не было пользы! Кроме того, если бы он не был потокобезопасным, то объединение его с INSERT в один мультизапрос не помогло бы. Это все равно будет зависеть от условий гонки.
Создаст ли это условия для гонки? Я запускаю более 400 узлов параллельно, что, если один узел INSERT сразу после другого