我认为这是真的,但我没有在网上找到任何确认信息。我可以使用last_insert_id()获取为自动增量字段生成的第一个id,但是我可以假设下一个记录将具有顺序ID吗?或者其他用户是否可以获取ID,以便生成的ID不是顺序的?
示例:插入mytable(asdf,qwer)值(1,2),(3,4),(5,6),...,(10000,10001);
如果mytable有自动增量列,并且如果两个用户同时运行此语句,一个用户将获取10000个连续ID,而另一个用户将获得下一个10000个连续ID吗?数百名用户怎么样?
感谢。
答案 0 :(得分:9)
这取决于使用的存储引擎。
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引擎可以保证这一点,但是我再也没有对这个特定的主题进行过多的研究。