【问题标题】:Auto-increment a primary key in MySql在 MySql 中自动增加主键
【发布时间】:2020-07-31 18:00:57
【问题描述】:

在 phpmyadmin 上使用 mysql 创建表的过程中,当涉及到主键及其自动增量时,我总是发现一个问题。当我在表中插入行时。 auto_increment 完美地为每个新行上的每个主键添加一个值 1。但是当我删除一行时,例如主键为“id = 4”的行,我在表中添加了一个新行。新行中的主键的值是“id = 5”而不是“id = 4”。它就像旧行从未被删除一样。

以下是 SQL 语句的示例:

CREATE TABLE employe(
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(30) NOT NULL
)

ENGINE = INNODB;

我该如何解决这个问题?

谢谢。

【问题讨论】:

  • 它的行为符合预期。因此,如果您的记录最多为 20,并且您删除了记录 10,您希望下一条记录的 id 为 10?不,它不会那样做。下一个 id 将是 21。

标签: mysql sql database datatables


【解决方案1】:

我很确定这是设计使然。如果您的表中有最多 6 个 ID,并且您删除了 ID 2,您是否希望下一个输入的 ID 为 2?这似乎不符合 ACID 属性。此外,如果存在对该数据的依赖,例如,如果它是用户数据,并且 ID 确定了用户 ID,它将使预先存在的信息无效,因为如果用户 X 被删除并且相同的 ID 被分配给用户 Y ,这可能会导致相关系统出现完整性问题。

另外,想象一个有 500 亿行的表。每次您尝试插入新记录时,表是否应该运行 O(n) 搜索最小的缺失 ID?我可以看到这种情况很快就会失控。

您可能想阅读的一些链接:

【讨论】:

    【解决方案2】:

    你为什么在乎?

    主键是内部行标识符,不应该是性感或好看的。只要它们能够唯一标识每一行,它们就可以达到目的。

    现在,如果您关心它的值,那么您可能希望在某处公开主键值,这是一个很大的危险信号。如果您需要一个外部的、可见的标识符,您可以使用您想要的任何格式序列和值创建一个辅助列。

    作为旁注,AUTO_INCREMENT 一词有点误导。这并不意味着它们一直在增加。这只是意味着它会尝试产生连续的数字,只要有可能。在多线程应用程序中,这通常是不可能的,因为批次或编号是为每个线程保留的,因此行插入序列可能实际上不遵循自然编号结束。行删除具有类似的效果,INSERT 具有回滚效果。

    【讨论】:

      【解决方案3】:

      主键用于将表连接在一起,并且 索引,它们并不打算用于人类使用。重新排序 主键列可能会孤立数据并破坏您的查询。

      提示:在您的表中添加另一列,并根据需要对该列重新排序(向您的用户显示该列而不是主键)。

      【讨论】:

        猜你喜欢
        • 2011-04-26
        • 2010-12-09
        • 1970-01-01
        • 1970-01-01
        • 2011-09-02
        • 2018-06-05
        • 2012-12-08
        • 2012-12-14
        • 1970-01-01
        相关资源
        最近更新 更多