【问题标题】:Mysql : is the auto increment highest value always the most recent?Mysql:自动增量最大值总是最新的吗?
【发布时间】:2018-01-19 10:29:02
【问题描述】:

我有一个数据库,其中的表使用 InnoDB 和一个自动增量字段作为主键。我想知道我是否可以相信使用auto_increment 的字段的最高值始终是最新的。

在这一点上我没有发现任何明确的内容。

【问题讨论】:

  • 因为可以删除行,NO。即使auto_increment 是一个连续计数器,也可能会删除一些条目,并且您可能会发现一个低于当前auto_increment 的值。例如,假设您插入 10 条记录,auto_increment 将位于 10。如果有人运行删除查询以删除该列的大于 1 的记录,则您的最大查询只会找到 1,而不是 10。但是,在下一个插入查询,auto_increment 的值将是 11,而不是 2。如果它可能与您的问题有关,请参阅关于 LAST_INSERT_ID() 的建议答案。
  • 我的问题可能令人困惑,或者我可能没有完全理解您要解释的内容。事实上,我的问题是关于selectstatement。所以我暗示如果我选择 auto_increment 字段的最大值,我是否总是有最近的条目?
  • 不,因为删除因素,LAST_INSERT_ID() 仅在 INSERT 查询之后是相对的。
  • 对不起,我还是不明白。删除因素在这里意味着什么?我的意思是,如果我删除一些条目,现有的最高值仍然是最新的没有?
  • 你知道的,你可以自己测试这个方面。创建一个新表,添加一些条目,以便 id 列(设置为 auto_increment)具有从 1 到 5 的值(或者任何您喜欢的值)。然后删除一些条目,比如大于 1,然后看看当您选择 id 列的最大值时会得到什么。您将不会获得auto_increment 值的最大值,但只会获得id 列的表中存在的最大值。

标签: mysql innodb auto-increment


【解决方案1】:

我在寻找类似问题的答案时偶然发现了这个问题,我相信这个问题存在一些混淆 - 所以回答:我可以依赖这样一个事实,即使用 auto_increment 的字段的最高值是总是最新的

根据https://dba.stackexchange.com/questions/60295/why-does-auto-increment-jumps-by-more-than-the-number-of-rows-inserted (auto_increment 列(或 MSSQL 中的 IDENTITY,以及该概念所采用的其他名称)的唯一保证是每个值都是唯一的,并且永远不会小于前一个值:因此您可以依赖这些值进行排序但你不能指望他们没有差距。)

是的,除非您手动更新自动生成的值。

【讨论】:

    【解决方案2】:

    并非总是如此。如果您插入一个值并删除它,那么最大值将不是最新的。

    我建议你在插入东西后使用LAST_INSERT_ID()

    对于 LAST_INSERT_ID(),最近生成的 ID 保存在 服务器基于每个连接。它不会被另一个人改变 客户。如果您更新另一个 AUTO_INCREMENT 它甚至不会改变 具有非魔术值的列(即,非 NULL 值和 不是 0)。

    Source

    【讨论】:

    • 感谢您的回答,但我忘记指定它是用于选择语句的。
    • 是的,没问题,您也可以将它与 SELECT 一起使用。喜欢SELECT * FROM table_name WHERE id=LAST_INSERT_ID()
    • 好吧,我的意思是没有任何 INSERT,只是一个 SELECT 语句。我会改用 MAX。
    • 您可以在不依赖任何 INSERT 的情况下使用它。仅供参考LAST_INSERT_ID() 是 mysql 中的内置函数。而且使用这个函数不依赖于任何类型的INSERT。
    • 我不确定。我试了一下只是为了看看,我按预期返回了一个空数组。顺便说一句,这不是我的问题的目的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-30
    • 1970-01-01
    • 1970-01-01
    • 2017-02-11
    • 2011-08-17
    相关资源
    最近更新 更多