【问题标题】:SQL, select last insert ID by LAST_INSERT_ID() [duplicate]SQL,通过 LAST_INSERT_ID() 选择最后一个插入 ID [重复]
【发布时间】:2015-04-23 08:48:48
【问题描述】:

我没有找到确切的答案,所以我试着在这里问。 我运行 SQL INSERT 查询,之后我想使用 这个 INSERT 查询,我发现了这个: LAST_INSERT_ID() 并且它有效,但我想如果我不是唯一在服务器上运行查询的人会发生什么我可以从数据库中获取错误的 ID,所以还有其他需要最后一个ID?

【问题讨论】:

  • 如果您在插入查询中使用 LAST_INSERT_ID(),则不必担心,因为这两个操作(获取最后一个 ID 和插入)都将在单个事务的上下文中发生。跨度>
  • 查看其他处理相同场景的帖子。 stackoverflow.com/questions/3837990/last-insert-id-mysql

标签: php mysql sql


【解决方案1】:

这既是对本问答中其他地方提出的误解的回答,也是对误解的澄清。

在您使用 AUTO_INCREMENT 对表执行 INSERT 操作后,该 AI 的值在 该连接中等待您;您可以通过 LAST_INSERT_ID(或您的客户端 API 的任何同义词)获取它。

它与连接绑定,而不是事务。

被绑定到连接,没有其他连接可以意外获取您刚刚创建的 id。

MAX(id) 确实冒着另一个连接插入另一行的风险,从而使 id 超出您刚刚插入的值。因此,MAX(id) 可能给你错误的值。

如果您需要执行 INSERT..ON DUPLICATE UPDATE,在线手册有一个清晰的示例说明如何获取行的 id,无论是 INSERTed 还是 UPDATEd。它要求你在更新部分看起来很笨拙id = LAST_INSERT_ID(id)

AUTO_INCREMENT 的唯一要求是它是 some 索引中的 first 列,不一定是 PRIMARY KEY。 (MyISAM 有一个例外,InnoDB 没有对应的。)可能不说 PRIMARY KEY(id) 会失去的是当你显式插入时防止重复 id 同样的 id。

【讨论】:

    【解决方案2】:

    它应该返回来自同一连接的最后插入的行 ID。因此,如果其他用户在其间插入了另一行,LAST_INSERT_ID 函数仍将返回第一个用户的相关 id。

    引用mysql文档:

    生成的 ID 在每个连接的基础上在服务器中维护。这意味着函数 (LAST_INSERT_ID) 返回给给定客户端的值是为影响该客户端的 AUTO_INCREMENT 列的最近语句生成的第一个 AUTO_INCREMENT 值

    这里是链接http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-id

    【讨论】:

    • 太好了,这回答了我的问题。
    【解决方案3】:

    您可以像这样从表中获取最后一个 id,如果 id 是自动递增的会更好

    Select max(id) from yourtable
    

    【讨论】:

    • 如果多人同时使用系统,这可能会出现问题。不能保证 max(id) 会返回所需的 id。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多