Как я понимаю this article:
С innodb_autoinc_lock_mode
набор к 0 («традиционный») или 1 («Последовательный»), значения автоматического прироста, генерируемые любым заданным оператором, будут последовательно, без пробелов, поскольку блокировка AUTO-INC на уровне таблицы сохраняется до конца оператора, и только один такой оператор может выполняться одновременно ,
Установка innodb_autoinc_lock_mode
на 0 или 1 гарантирует, что автоматические инертные идентификаторы являются последовательными.
Таким образом, идентификатор, который вы получаете от LAST_INSERT_ID
, является первым из новых идентификаторов и LAST_INSERT_ID
+ «количество затронутых строк» является последним из новых идентификаторов.
Также LAST_INSTERT_ID
не зависит от других соединений
Идентификатор, который был сгенерирован сохраняется на сервере на основе каждого соединения. Это означает, что значение, возвращаемое функцией для данного клиента, является первым значением AUTO_INCREMENT, сгенерированным для самого последнего оператора, влияющим на столбец AUTO_INCREMENT этого клиента. Это значение не может повлиять на других клиентов, даже если они генерируют собственные значения AUTO_INCREMENT. Такое поведение гарантирует, что каждый клиент может получить свой собственный идентификатор, не заботясь о деятельности других клиентов, и без необходимости блокировок или транзакций.
Но обратите внимание, что могут быть неправильные результаты, если вы используете INSERT ... ON DUPLICATE KEY UPDATE
или INSERT IGNORE ...
. Но я не проверял это.
Вы можете получить только идентификатор вставки 1-й строки. Возможно, можно убедиться в том, что идентификаторы последовательны, используя опцию 'innodb_autoinc_lock_mode' (и, возможно, другие настройки), но я не пробовал ее, и ее будет сложно проверить правильно. – Vatev
Возможный дубликат http://stackoverflow.com/questions/4637367/mysql-last-insert-id-used-with-multiple-records-insert-statement – P0rnflake