我的表格中有AUTO INCREMENT
列。我必须在插入新行时检索此列的值(我需要新行的值)。我已经阅读了很多关于它的内容并找到了不同的解决方案,一个是使用SELECT LAST_INSERT_ID()
。我听说过很多不同的事情。我可以或不可以使用它吗?我担心另一个连接可能会在我能够调用SELECT LAST_INSERT_ID()
之前插入一个新行,因此会得到错误的ID。
总结一下,使用SELECT LAST_INSERT_ID()
是否安全?如果没有,我如何以安全的方式检索最后插入的ID?
答案 0 :(得分:13)
我不认为你需要担心你在这里提到的情况。
来自Mysql文档:
生成的ID基于每个连接在服务器中维护。这意味着函数返回给定客户端的值是为该客户端影响AUTO_INCREMENT
列的最新语句生成的第一个AUTO_INCREMENT
值。此值不受其他客户端的影响,即使它们生成自己的AUTO_INCREMENT
值。此行为可确保每个客户端都可以检索自己的ID,而无需关心其他客户端的活动,也无需锁定或事务。
有关详细信息,请参阅this
虽然如果他们有不同的意见,我很乐意从别人那里读到。
答案 1 :(得分:0)
如果您拥有该表的最后一个ID是至关重要的,则可以锁定该表以进行写入,然后生成SELECT MAX(id) FROM table_name
然后解锁表。
答案 2 :(得分:0)
生成的ID是基于每个连接的,所以你不应该有任何问题! This帖子详细介绍。
答案 3 :(得分:0)
是的,根据官方文件,这是安全的:
生成的ID基于每个连接在服务器中维护。这意味着函数返回给定客户端的值是为该客户端影响AUTO_INCREMENT列的最新语句生成的第一个AUTO_INCREMENT值。此值不受其他客户端的影响,即使它们生成自己的AUTO_INCREMENT值。此行为可确保每个客户端都可以检索自己的ID,而无需关心其他客户端的活动,也无需锁定或事务。
答案 4 :(得分:0)
如果您使用的是PDO,请使用PDO::lastInsertId.
如果您使用的是mysql,请使用mysqli::$insert_id.
是的,使用AI
是安全的。这是帖子,上面写着:
http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html
而不是直接使用select语句,请尝试使用preparedStatement.
您也可以使用Lock