MySQL多行插入是否会抓取连续的自增ID?

13
我认为这是正确的,但我在网上没有找到任何确认它的东西。我可以使用last_insert_id()来获取自增字段生成的第一个id,但我可以假设下一条记录将具有连续的ID号吗?或者另一个用户可能会获取一个id,使得结果的ID不连续?
例如:insert into mytable (asdf, qwer) values (1,2), (3,4), (5,6), ... , (10000,10001);
如果mytable有一个自增列,并且如果两个用户同时运行此语句,那么一个用户会获取10000个连续的ID,另一个用户会获取下一个10000个连续的ID吗?那如果有数百个用户呢?
谢谢。

1
据我所知,这可能是真的,但您没有任何保证。 - Nanne
3个回答

11

这取决于所使用的存储引擎。

  • MyISAM 保证插入的行具有连续的ID,因为在插入期间持有表级锁。
  • InnoDB:除非将 innodb_autoinc_lock_mode 设置为 interleaved (2),否则插入的行将具有连续的ID。默认情况下,InnoDB 在5.1及以后版本中运行在consecutive模式下,在此之前的版本中运行在traditional模式下。

有关 innodb_autoinc_lock_mode 选项的更多信息,请参见 13.6.4.3. InnoDB自动增量处理


5
如果您使用LOCK TABLES,批处理应该获取连续的ID。
例如:
LOCK TABLES users WRITE;
<BULK INSERT HERE>
UNLOCK TABLES;

这将防止多个线程同时写入表格。

我可以在InnoDB引擎中使用LOCK TABLES ..吗? - stack
是的 - LOCK TABLES 可以与 InnoDB 一起使用 - 请查看锁定文档:https://dev.mysql.com/doc/refman/5.5/en/innodb-locking.html - Matt MacLean

2
一个多行插入只是一个重复执行相同操作的批量操作。当插入语句被触发时,它会触发生成ID的触发器。
因此,如果使用的数据库引擎按顺序执行所有工作(类似于队列-先进先出),那么是的,顺序ID将比前一个ID增加一个增量;如果数据以多线程方式插入,其中语句并行触发,则不会,ID将被“随机”赋予。
我不知道任何保证此功能的MySQL引擎,但我也没有在这个特定主题上进行过多的研究。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接