在我的应用程序中,我有很多外键依赖项,并且经常插入大量行。到目前为止,我所做的只是一次运行单个插入,并记录插入ID。即使在同一台服务器上运行apache和mysql时,插入大量行也往往会花费很长时间。
我的问题是,如果我要更改应用程序以使用单个INSERT添加许多行,我是否能够严格基于mysql连接返回的最后一个插入ID来假设每一行的ID?问题在于,偶尔会有多个人一次将大量信息放入数据库中的情况。
根据我的判断,可以安全地假设,当您插入500行时,无论来自另一个连接的查询是开始还是结束,插入ID的范围都是(lastInsertID)到(lastInsertID + 499)。完成所需的时间,但我想确定这是安全的做法。
我主要运行InnoDB,但偶尔也有MyISAM。
谢谢大家!
-杰尔
最佳答案
mysql_insert_id和现在推荐的替代mysqli_insert_id从您运行的最后一个查询的受影响表的AUTO_INCREMENT列中返回第一个条目ID。
从第一个条目AUTO_INCREMENT索引迭代插入Mysql分组的INSERT语句。因此可以肯定的是,从单个INSERT语句插入的条目是连续的。
来自Mysql reference的注释“生成的ID会在每个连接的基础上在服务器中维护。这意味着该函数返回给定客户端的值是为最近一条影响AUTO_INCREMENT列的语句生成的第一个AUTO_INCREMENT值。该客户端,即使其他客户端生成自己的AUTO_INCREMENT值,该值也不会受到影响。此行为可确保每个客户端都可以检索自己的ID,而无需担心其他客户端的事件,也无需进行锁定或事务处理。
关于php - MySQL并发多行插入-插入ID假设,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/11318982/