停止MySQL重用AUTO_INCREMENT ID

时间:2010-09-15 13:45:22

标签: sql mysql

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

有没有办法让MySQL像t-SQL一样运行,而不是重用ID?然后,如果从数据库外部的某些内容错误地引用了已删除的行,则不会返回任何行,突出显示错误。

5 个答案:

答案 0 :(得分:3)

在这种情况下,您可能不应该在公共可访问的地方使用AUTO_INCREMENT索引。

从其他数据派生关键字段,或使用其他机制创建您的ID。我之前使用过的一种方法,虽然你需要知道(可能是严重的)性能影响,但是一个“密钥”表来跟踪最后使用的密钥,并增加它。

这样,你可以使用你想要的任何类型的键,甚至是非数字键,并使用你自己的算法递增它们。

我过去使用了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

答案 1 :(得分:1)

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

答案 2 :(得分:1)

据我所知,没有办法做到这一点。您可以考虑通过添加已删除的标志来解决它,然后设置已删除的标志而不是删除该行。

“正确”的答案是,一旦删除一行,就不应该引用它。您可以添加外键以确保db不允许删除在db中其他位置引用的行。

答案 3 :(得分:0)

Mysql手册says

  

在这种情况下(当AUTO_INCREMENT列是多列索引的一部分时),如果删除任何组中具有最大AUTO_INCREMENT值的行,则重用AUTO_INCREMENT值。 即使对于MyISAM表也会发生这种情况,因为通常不会重复使用AUTO_INCREMENT值。

除了MyISAM

之外,引擎似乎还有这样的行为

答案 4 :(得分:0)

从MySQL版本8开始,MySQL不再重用AUTO_INCREMENT ID值,从而修复了长期存在(于2003年启用!!)的bug #199

有关更多信息,请参见MySQL Community Manager lefred的这篇博客文章:https://lefred.be/content/bye-bye-bug-199/