AUTO INCREMENT
列的表。我需要在插入新行时检索此列的值(我需要新行的值)。我已经阅读了很多关于此问题的内容,并找到了不同的解决方案,其中一个是使用SELECT LAST_INSERT_ID()
。我听说过很多不同的事情。我能否使用它?我担心另一个连接可能会在我调用SELECT LAST_INSERT_ID()
之前插入新行,从而获得错误的ID。总之,使用
SELECT LAST_INSERT_ID()
是否安全?如果不安全,如何以安全的方式检索最后插入的ID?AUTO INCREMENT
列的表。我需要在插入新行时检索此列的值(我需要新行的值)。我已经阅读了很多关于此问题的内容,并找到了不同的解决方案,其中一个是使用SELECT LAST_INSERT_ID()
。我听说过很多不同的事情。我能否使用它?我担心另一个连接可能会在我调用SELECT LAST_INSERT_ID()
之前插入新行,从而获得错误的ID。SELECT LAST_INSERT_ID()
是否安全?如果不安全,如何以安全的方式检索最后插入的ID?我认为您不需要担心您在此提到的情况。
来自Mysql文档:
生成的ID在服务器上以每个连接为基础进行维护。这意味着函数对于给定客户端返回的值是该客户端最近影响具有AUTO_INCREMENT
列的语句所生成的第一个AUTO_INCREMENT
值。即使其他客户端生成了它们自己的AUTO_INCREMENT
值,该值也不会受到其他客户端的影响。这种行为确保了每个客户端都可以检索其自己的ID,而无需关注其他客户端的活动,也无需锁定或事务。
有关详细信息,请参阅this
虽然,如果其他人有不同的观点,我很愿意听取他们的意见。
如果您需要获取表的最后一个ID非常重要,您可以锁定该表进行写操作,然后执行SELECT MAX(id) FROM table_name
,最后解锁该表。
是的,根据官方文档,这是安全的:
生成的ID在服务器上以每个连接为基础进行维护。这意味着函数对于给定客户端返回的值是由该客户端最近影响AUTO_INCREMENT列的语句生成的第一个AUTO_INCREMENT值。即使其他客户端生成了自己的AUTO_INCREMENT值,该值也不会受到其他客户端的影响。此行为确保每个客户端都可以检索其自己的ID,而不必担心其他客户端的活动,也不需要锁定或事务。
如果您正在使用PDO,请使用PDO::lastInsertId
。
如果您正在使用mysql,请使用mysqli::$insert_id
。
是的,使用AI
是安全的。这篇文章说了这个:
http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html
而且,尝试使用preparedStatement
而不是直接使用select语句。
此外,您可以使用Lock。