我有一个带有AUTO_INCREMENT主键的表。如果删除表中的最后一行,则下一个插入的行将采用相同的ID。
有没有办法让MySQL像t-SQL一样运行,而不是重用ID?然后,如果从数据库外部的某些内容错误地引用了已删除的行,则不会返回任何行,突出显示错误。
答案 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/