【发布时间】:2011-04-12 16:56:16
【问题描述】:
我有一个带有 AUTO_INCREMENT 主键的表。如果删除表中的最后一行,则下一个插入的行将采用相同的 ID。
有没有办法让 MySQL 表现得像 t-SQL,而不是重用 ID?然后,如果从数据库外部错误地引用了删除的行,则不会返回任何行,从而突出显示错误。
【问题讨论】:
我有一个带有 AUTO_INCREMENT 主键的表。如果删除表中的最后一行,则下一个插入的行将采用相同的 ID。
有没有办法让 MySQL 表现得像 t-SQL,而不是重用 ID?然后,如果从数据库外部错误地引用了删除的行,则不会返回任何行,从而突出显示错误。
【问题讨论】:
在这种情况下,您可能不应该在可公开访问的地方使用 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
【讨论】:
从 MySQL 版本 8 开始,MySQL 不再重复使用 AUTO_INCREMENT ID 值,修复了长期存在的(2003 年开放!!)bug #199。
有关更多信息,请参阅 MySQL 社区经理 lefred 的这篇博文:https://lefred.be/content/bye-bye-bug-199/
【讨论】:
这不是我们的 MySQL 数据库的工作方式,当一条记录被删除时,下一个插入的记录有下一个编号,而不是被删除的那个。
【讨论】:
据我了解,没有办法做到这一点。您可以考虑通过添加已删除标志来解决此问题,然后设置已删除标志而不是删除该行。
“正确”的答案是,一旦删除了一行,就不应引用它。您可以添加外键以确保数据库不会允许删除数据库中其他地方引用的行。
【讨论】:
Mysql手册says:
在这种情况下(当 AUTO_INCREMENT 列是多列索引的一部分时),如果您删除任何组中具有最大 AUTO_INCREMENT 值的行,则会重用 AUTO_INCREMENT 值。 即使是 MyISAM 表也会发生这种情况,通常不会对其重用 AUTO_INCREMENT 值。
似乎除了 MyISAM 之外的引擎可能存在这种行为
【讨论】: