【问题标题】:Easy mysql question regarding primary keys and an insert关于主键和插入的简单mysql问题
【发布时间】:2008-10-03 00:07:26
【问题描述】:

在mysql中,当自动递增时,如何获取用于插入操作的主键。

基本上,我希望在语句完成时返回新的自动增量值。

谢谢!

【问题讨论】:

  • 澄清:代码已插入,然后是 last_insert_id。其中两个语句几乎同时执行,执行顺序变为 insert #1 insert #2 last_insert_id #1 完成并从 insert#2 返回 id last_insert_id #2 完成并从 insert#2 返回 id 这会发生吗?

标签: mysql insert primary-key


【解决方案1】:

您的澄清评论说您有兴趣确保 LAST_INSERT_ID() 在发生另一个并发 INSERT 时不会给出错误结果。请放心,无论其他并发活动如何,使用 LAST_INSERT_ID() 都是安全的。 LAST_INSERT_ID() 仅返回当前会话期间生成的最新 ID。

你可以自己试试:

  1. 打开两个shell窗口,运行mysql 每个客户端并连接到 数据库。
  2. Shell 1:插入到带有 AUTO_INCREMENT 键。
  3. 外壳 1:选择 LAST_INSERT_ID(), 查看结果。
  4. Shell 2:插入到同一个表中。
  5. 外壳 2:选择 LAST_INSERT_ID(), 查看与 shell 1 不同的结果。
  6. 外壳 1:选择 LAST_INSERT_ID() 再次,看到前面的重复 结果。

如果你仔细想想,这是唯一有意义的方法。所有支持自动递增密钥机制的数据库都必须以这种方式运行。如果结果取决于其他客户端可能同时插入的竞争条件,那么就没有可靠的方法来获取当前会话中最后插入的 ID 值。

【讨论】:

  • @Bill Karwin 非常感谢这篇有用的帖子。一个问题:假设在多线程环境中,最后一个可用的 Auto inc 键值是 10.. 然后外壳 1 的线程无法插入,同时外壳 2 正在插入.. last_insert_id() 会是什么? 11 还是 12?非常感谢
  • @shadesco:取决于您的 MySQL 版本,但在 5.1 及更高版本的 InnoDB 中,第一个会话将增加 auto-inc 并且该值将丢失。然后第二个会话将得到 12。见 dev.mysql.com/doc/refman/5.1/en/…
【解决方案2】:

MySQL 的 LAST_INSERT_ID()

【讨论】:

    【解决方案3】:

    MySQL 文档描述了该功能:LAST_INSERT_ID()

    【讨论】:

      【解决方案4】:

      [select max(primary_key_column_name) from table_name] 啊,不一定。我不是 MySQL 人,但有一些特定的方法可以为最后完成的操作获取最后插入的 id,这些方法比这更强大。如果在您写入表和查询它之间发生了插入怎么办?我知道是因为它在很多个月前刺痛了我(所以它确实发生了)。 如果一切都失败了,请阅读手册:http://dev.mysql.com/doc/refman/5.0/en/getting-unique-id.html

      【讨论】:

        猜你喜欢
        • 2011-03-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-07
        • 1970-01-01
        • 2011-09-21
        相关资源
        最近更新 更多