2010-09-15 41 views
6

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

有没有办法使MySQL的行为像T-SQL一样,而不是重用ID?然后,如果删除的行被错误地从数据库的外部引用,则不会返回任何行,从而突出显示该错误。

回答

2

其他在这种情况下,你可能不应该在公开访问的地方使用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 
+0

在其他所有方面, AUTO_INCREMENT很好地服务于我的目的,并且保持插入查询的简单性。我想我会使用“ALTER TABLE x AUTO_INCREMENT = y”构造来强制删除标识转发。 – Paul 2010-09-15 21:00:37

1

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

+0

我认为当你重新启动数据库将其重置。 – 2010-09-15 14:20:47

+3

InnoDB在重新启动数据库时重置。当InnoDB启动时,它会找到最高的增量,然后从那里开始。 MyISAM缓存增量ID,所以这不会发生。 – 2010-09-15 16:21:49

+0

在我使用的MySQL(5.7.x)中,一旦最高密钥的记录被删除,下一个新记录>立即<重新使用该密钥值。不需要重启数据库。 – Riva 2016-08-06 18:56:09

1

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

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

+2

对不起,我只是重读你的问题,并且看到你并不担心引用已删除行的其他数据库元素,而是被引用为“数据库外部”。这将表明可能是某个用户书签链接,其中包含该网址中的ID,然后当他们重复使用该书签而不是获得任何结果时,它们会得到错误的结果。在这种情况下,我想说删除标志可能是最好的方法,并且在访问数据时更改表示逻辑以显示适当的“已删除”用户消息。 – 2010-09-15 14:24:17

+1

删除标志的问题在于,您必须记住在访问数据的每个查询中(并且在我的情况下有很多查询)将它用作约束条件,然后考虑任何索引影响 – Paul 2010-09-15 20:45:01

0

MySQL手册says

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

似乎有这种可能一个行为引擎,比MyISAM数据