使用MYSQL LAST_INSERT_ID()来检索插入行的ID?

5
我有一个带有AUTO INCREMENT列的表。我需要在插入新行时检索此列的值(我需要新行的值)。我已经阅读了很多关于此问题的内容,并找到了不同的解决方案,其中一个是使用SELECT LAST_INSERT_ID()。我听说过很多不同的事情。我能否使用它?我担心另一个连接可能会在我调用SELECT LAST_INSERT_ID()之前插入新行,从而获得错误的ID。
总之,使用SELECT LAST_INSERT_ID()是否安全?如果不安全,如何以安全的方式检索最后插入的ID?

最后插入的ID应该返回当前连接生成的最后一个ID。不需要担心其他连接。 - Jonnix
请参考此链接:http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id - Bhavik Shah
2
如果您有自动连接池,则运行另一个调用可能会在不同的连接中完成。如果您没有这个功能,那么就是安全的。 - Erik Ekman
什么是自动连接池?我正在使用带有mysqli的PHP。发现我可以调用mysqli->last_id。 - AlexanderNajafi
5个回答

12

我认为您不需要担心您在此提到的情况。

来自Mysql文档:
生成的ID在服务器上以每个连接为基础进行维护。这意味着函数对于给定客户端返回的值是该客户端最近影响具有AUTO_INCREMENT列的语句所生成的第一个AUTO_INCREMENT值。即使其他客户端生成了它们自己的AUTO_INCREMENT值,该值也不会受到其他客户端的影响。这种行为确保了每个客户端都可以检索其自己的ID,而无需关注其他客户端的活动,也无需锁定或事务。

有关详细信息,请参阅this

虽然,如果其他人有不同的观点,我很愿意听取他们的意见。


0

如果您需要获取表的最后一个ID非常重要,您可以锁定该表进行写操作,然后执行SELECT MAX(id) FROM table_name,最后解锁该表。


0
生成的ID是基于每个连接的,所以您不应该遇到任何问题!帖子详细介绍了更多信息。

0

是的,根据官方文档,这是安全的:

生成的ID在服务器上以每个连接为基础进行维护。这意味着函数对于给定客户端返回的值是由该客户端最近影响AUTO_INCREMENT列的语句生成的第一个AUTO_INCREMENT值。即使其他客户端生成了自己的AUTO_INCREMENT值,该值也不会受到其他客户端的影响。此行为确保每个客户端都可以检索其自己的ID,而不必担心其他客户端的活动,也不需要锁定或事务。

摘自:MYSQL文档12.13.信息函数


0

如果您正在使用PDO,请使用PDO::lastInsertId

如果您正在使用mysql,请使用mysqli::$insert_id

是的,使用AI是安全的。这篇文章说了这个: http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

而且,尝试使用preparedStatement而不是直接使用select语句。

此外,您可以使用Lock


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