5

我有一个表,其中有一列AUTO INCREMENT。插入新行时,我必须检索该列的值(我需要新行的值)。我已经阅读了很多关于它并找到了不同的解决方案,一种是使用SELECT LAST_INSERT_ID(). 我听说过很多不同的事情。我可以或不可以使用这个吗?我担心另一个连接可能会在我能够调用之前插入一个新行SELECT LAST_INSERT_ID(),从而得到错误的 ID。

总结一下,使用安全SELECT LAST_INSERT_ID()吗?如果没有,我怎样才能以安全的方式检索最后插入的 id?

4

5 回答 5

13

我认为您不必担心您在这里提到的情况。

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

有关详细信息,请参阅this

虽然,如果他们有不同的意见,我很乐意从其他人那里阅读。

于 2013-01-09T15:39:41.420 回答
0

如果拥有表的最后一个 id 对您来说很重要,您可以锁定表以进行写入,然后生成SELECT MAX(id) FROM table_name然后解锁表。

于 2013-01-09T15:39:36.483 回答
0

生成的 ID 是基于每个连接的,所以你不应该有任何问题!这篇文章更详细。

于 2013-01-09T15:40:31.277 回答
0

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

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

取自:MYSQL 文档 12.13。信息功能

于 2013-01-09T15:40:43.150 回答
0

如果您使用的是 PDO,请使用PDO::lastInsertId.

如果您使用的是 mysql,请使用mysqli::$insert_id.

是的,使用它是安全的AI这是这样说的帖子:http: //dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

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

你也可以使用

于 2013-01-09T16:06:49.103 回答