【问题标题】:How next value is generated for auto increment primary key如何为自增主键生成下一个值
【发布时间】:2014-09-03 20:50:08
【问题描述】:

您好,我正在使用 Java 和 SQL(XAMPP) 开发项目数据库。

为什么“ID”不会增加到下一个可用值。请注意,我删除了 2-8 中的所有连续数字。并且“ID”具有 A_I(自动增量)。

ID     username password fname mname lname course address contact status

1     31231231    123     new   old  smith  BSCS   123      123    USER

9      123       ASD     ASD    ASD ASD    BSCpE  ASD       123    USER

为什么是 (1,9) 而不是 (1,2)?

【问题讨论】:

  • "I deleted some of the consecutive numbers from 2-8" - 您似乎删除了 2-8 中的所有条记录。如果您删除了它们,为什么您希望它们仍会出现在您的查询中?

标签: mysql sql database


【解决方案1】:

你回答了你的问题。您删除了 2-8 之间的数字。

所以它是一个 MySQL 数据库,自动递增不会根据列的最大值递增数字。

考虑一下。计算表中的最大数量并为下一条记录增加它的效率要低得多。

而不是在某处写下该列上使用的最后一个数字并在请求新数字时增加它更有效。

我不是 MySQL 专家,但 MySQL 显然使用内部机制作为序列来增加列值。

如果您删除一个数字,则具有不连续的数字是完全可以的。事实上,我认为在大多数情况下这是可取的。保持原状。只要数字是唯一的,为什么要打扰您?

【讨论】:

  • 我明白了,我是 sql 新手,这就是为什么我要冒险进入它。感谢您的澄清。只是看到 (1,6,8,9..) 比 (1,2,3,4..) 让我感到困扰。它有什么影响吗?或者除非它会,如果我包含“ID”列对吗?
  • 重复使用数字不仅“效率低下”,而且非常危险。标识符是用来识别某些东西的。如果两个不同的对象不是完全相同的事物,则它们不应具有相同的标识符,即使其中一个不再存在。
  • @Starvinmarvinnn:从长远来看,如果您的标识符不是唯一的,它最终会更多地困扰您
  • 谢谢大家的启发。大帮助!干杯!
  • 您还会在其中插入已回滚的事务或使用 ON DUPLICATE KEY UPDATE 的地方看到这一点(不喜欢在具有 auto_increment 的表上使用它)。
【解决方案2】:

数字可能不连续,因为 (a) 删除,或 (b) 在从未提交的事务中生成的 ID。

其他答案指出了重复使用 ID 的一些问题。最大的问题是当一个 ID 在与原始数据库的一致性边界之外的另一个系统共享后被重用时会发生什么,即复制到另一个 SQL Server 数据库,或通过集成中间件到一臂之力的系统。

底线:永远不要重复使用 ID。

【讨论】:

    猜你喜欢
    • 2020-07-12
    • 2020-09-09
    • 1970-01-01
    • 2016-12-03
    • 1970-01-01
    • 2014-06-17
    • 1970-01-01
    • 2018-12-25
    • 2020-10-27
    相关资源
    最近更新 更多