【问题标题】:Using MYSQL LAST_INSERT_ID() to retrive the ID of inserted row?使用 MYSQL LAST_INSERT_ID() 检索插入行的 ID?
【发布时间】:2012-12-23 17:03:26
【问题描述】:

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

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

【问题讨论】:

  • Last insert id 应该返回为当前连接生成的最后一个 id。无需担心其他连接。
  • 如果你有自动连接池,运行另一个调用可能会在不同的连接中完成。如果你没有那个,你是安全的。
  • 什么是自动连接池?我正在将 PHP 与 mysqli 一起使用。发现我可以直接调用 mysqli->last_id。

标签: php mysql select lastinsertid


【解决方案1】:

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

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

详情请参考this

不过,如果他们有不同的意见,我很乐意阅读其他人的文章。

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      生成的 ID 是基于每个连接的,所以您应该没有任何问题! This 帖子更详细。

      【讨论】:

        【解决方案4】:

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

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

        取自:MYSQL Documentation 12.13. Information Functions

        【讨论】:

          【解决方案5】:

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

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

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

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

          您也可以使用Lock

          【讨论】:

            猜你喜欢
            • 2012-04-14
            • 1970-01-01
            • 2015-09-30
            • 2015-05-14
            • 1970-01-01
            • 2011-06-30
            • 2011-09-08
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多