Когда я делаю одну строку INSERT
в таблице, в которой есть AUTO_INCREMENT
столбец, я хотел бы использовать LAST_INSERT_ID()
функцию для возврата нового AUTO_INCREMENT
значения ed, сохраненного для этой строки.
Поскольку многие разработчики и администраторы Microsoft SQL Server, без сомнения, знают, что эквивалентная функциональность в SQL Server ( SCOPE_IDENTITY
и @@IDENTITY
) не обошлась без проблем .
Я знаю состояние документов MySQL:
Сгенерированный идентификатор поддерживается на сервере для каждого подключения . Это означает, что значение, возвращаемое функцией данному клиенту, является первым
AUTO_INCREMENT
значением, сгенерированным для самого последнего оператора, влияющего наAUTO_INCREMENT
столбец этим клиентом . На это значение не могут повлиять другие клиенты, даже если они генерируютAUTO_INCREMENT
собственные значения. Такое поведение гарантирует, что каждый клиент может получить свой собственный идентификатор, не заботясь об активности других клиентов и не нуждаясь в блокировках или транзакциях.
и даже зайти так далеко, чтобы сказать:
Использование столбцов
LAST_INSERT_ID()
иAUTO_INCREMENT
столбцов одновременно от нескольких клиентов вполне допустимо.
Существуют ли какие-либо известные риски или сценарии, которые могут привести LAST_INSERT_ID()
к неправильному возвращению значения?
Я использую MySQL 5.5 на CentOS 5.5 x64 и Fedora 16 x64 и движок InnoDB.
Подробнее о пункте 2 в ответе DTest:
В версиях MySQL , которые я использовал, это хорошая идея , чтобы в явной форме сбросить значение LAST_INSERT_ID до каждого блока кода , где вы собираетесь выполнить вставку.
Это можно сделать так:
После выполнения вышеуказанной серии операторов вы узнаете, оказал ли вставка какое-либо влияние, проверив, было ли LAST_INSERT_ID по-прежнему установлено в "some_flag_init_value_of_your_choice" в конце выполнения.
В противном случае вы можете столкнуться со следующей проблемной ситуацией:
Поскольку вторая вставка завершилась неудачно , вы, возможно, ожидали, что второй вызов LAST_INSERT_ID либо возвратит NULL, либо что он даст пустой набор результатов (ноль строк). Тот факт, что он по-прежнему возвращает действительный целочисленный идентификатор, может ввести вас в заблуждение, полагая, что вторая вставка SUCCEEDED, если это не так.
Ситуация ДАЖЕ ВЕЧНАЯ, если учесть, что LAST_INSERT_ID будет продолжать сохранять и повторять последний успешный уникальный идентификатор, даже если последующие ошибочные операторы вставки нацелены на таблицы, отличные от таблицы, которая создала последний успешный уникальный идентификатор. Другими словами, вы вставляете в таблицу TA и получаете идентификатор 5, затем вставляете в TB (но он терпит неудачу), но вы все равно видите 5. На основании этого вы думаете, что вы только что создали новую строку в TA с идентификатором 5 и новой строкой в ТБ с идентификатором 5, тогда как в действительности либо в ТБ не существует ни одной строки с идентификатором 5, или такая строка существует, но на самом деле она не имеет ничего общего с любым кодом, который вы только что RAN.
источник
last_insert_id()
чтобы судить, был ли запрос успешным. В конце концов, это последний вставленный идентификатор, содержащий значения, которые вам нужны, когда вы уже знали, что добились успеха.