代码之家  ›  专栏  ›  技术社区  ›  Paul

停止MySQL重用自动增量ID

  •  8
  • Paul  · 技术社区  · 14 年前

    我有一个带有自动递增主键的表。如果删除了表中的最后一行,则插入的下一行将采用相同的ID。

    有没有办法让MySQL表现得像t-SQL,而不是重用ID?如果删除的行被错误地从数据库外部引用,则不会返回任何行,从而突出显示错误。

    5 回复  |  直到 14 年前
        1
  •  3
  •   Cylindric    14 年前

    在这种情况下,您可能不应该在可公开访问的位置使用自动增量索引。

    这样,您就可以使用任何类型的密钥,甚至是非数字密钥,并使用自己的算法对它们进行递增。

    我过去使用过6个字符的字母数字键:

    CREATE TABLE `TableKeys` (
      `table_name` VARCHAR(8) NOT NULL,
      `last_key` VARCHAR(6) NOT NULL,
      PRIMARY KEY (`table_name`)
    );
    
    SELECT * FROM `TableKeys`;
    
    table_name | last_key
    -----------+---------
    users      | U00003A2
    articles   | A000166D
    products   | P000009G
    
        2
  •  2
  •   Jon Schneider Stefan    6 年前

    从MySQL版本8开始,MySQL不再重复使用自动增量ID值,修复了长期存在的问题(2003年开放!!) bug #199 .

    https://lefred.be/content/bye-bye-bug-199/

        3
  •  1
  •   Leslie    14 年前

    这不是我们MySQL数据库的工作方式,当一个记录被删除时,下一个插入的是下一个编号,而不是被删除的编号。

        4
  •  1
  •   Jeremy Goodell    14 年前

    据我所知,这是没有办法的。您可以考虑添加一个deleted标志,然后设置deleted标志,而不是删除行。

    正确的答案是,一旦一行被删除,就不应该引用它。您可以添加外键,以确保数据库不允许删除数据库中其他地方引用的行。

        5
  •  0
  •   Your Common Sense    14 年前

    says

    在这种情况下(当AUTO\u INCREMENT列是多列索引的一部分时),如果删除任何组中具有最大AUTO\u INCREMENT值的行,将重用AUTO\u INCREMENT值。 甚至对于MyISAM表也会发生这种情况,通常不会重用自动增量值。

    似乎有这样的行为可能的引擎,而不是MyISAM