MySQL多行插入是否会获取顺序自动增量ID?

时间:2011-12-12 21:54:22

标签: mysql bulkinsert

我认为这是真的,但我没有在网上找到任何确认信息。我可以使用last_insert_id()获取为自动增量字段生成的第一个id,但是我可以假设下一个记录将具有顺序ID吗?或者其他用户是否可以获取ID,以便生成的ID不是顺序的?

示例:插入mytable(asdf,qwer)值(1,2),(3,4),(5,6),...,(10000,10001);

如果mytable有自动增量列,并且如果两个用户同时运行此语句,一个用户将获取10000个连续ID,而另一个用户将获得下一个10000个连续ID吗?数百名用户怎么样?

感谢。

3 个答案:

答案 0 :(得分:9)

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

  • MyISAM 可确保插入的行具有顺序ID,因为在插入过程中会保留表级锁定。
  • InnoDB :除非innodb_autoinc_lock_mode设置为 interleaved(2),否则插入的行将具有顺序ID。默认情况下,InnoDB从consecutive模式运行,自5.1和traditional模式之前。

有关innodb_autoinc_lock_mode选项的更多信息,请参阅13.6.4.3. AUTO_INCREMENT Handling in InnoDB

答案 1 :(得分:4)

如果您使用LOCK TABLES,批次应该获取顺序ID。

示例:

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

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

答案 2 :(得分:2)

多行插入只是一个批量操作,一遍又一遍地执行相同的操作。 当触发insert语句时,它会触发一个生成ID的触发器。

因此,如果使用数据库引擎,则按顺序执行所有工作(队列如先进先出),然后是,顺序id将比前一个id高一个增量;如果数据以多线程方式插入并且并行触发语句,那么不会,id将以“random”的形式给出。

我不知道有任何mysql引擎可以保证这一点,但是我再也没有对这个特定的主题进行过多的研究。