Does a MySQL multi-row insert grab sequential autoincrement IDs?

我怕爱的太早我们不能终老 提交于 2019-11-27 23:07:59

It depends on the storage engine used.

  • MyISAM guarantees the inserted rows to have sequential ID's, since a table-level lock is held during the insert.
  • InnoDB: unless innodb_autoinc_lock_mode is set to interleaved (2), the inserted rows will have sequential ID's. By default InnoDB runs in consecutive mode since 5.1 and traditional mode prior.

For more on the innodb_autoinc_lock_mode option, see 13.6.4.3. AUTO_INCREMENT Handling in InnoDB

If you use LOCK TABLES, the batches should grab sequential id's.

Example:

LOCK TABLES users WRITE;
<BULK INSERT HERE>
UNLOCK TABLES;

This will prevent multiple threads from writing to the table at the same time.

A multi-row insert is just a bulk-operation that performs the same operation over and over again. When an insert statement is fired, it fires a trigger that generates the ID.

So if the database engine used, performs all of its work in a sequential way (queue like - first-in first-out) then yes, sequential id's will be one increment higher than the previous id; if the data is inserted in a multi-threaded way where statements are fired in parallel, then no, id's will be given at "random".

I am not aware of any mysql engine that guarantees this, but then again I haven't made much research in this specific subject.

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!