Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
停止MySQL重用自动增量ID_Sql_Mysql - Fatal编程技术网

停止MySQL重用自动增量ID

停止MySQL重用自动增量ID,sql,mysql,Sql,Mysql,我有一个带有自动递增主键的表。如果删除了表中的最后一行,则插入的下一行将采用相同的ID 有没有办法让MySQL表现得像t-SQL一样,而不重用ID?然后,如果删除的行从数据库外部错误引用,则不会返回任何行,突出显示错误。这不是我们的MySQL数据库的工作方式,当删除记录时,插入的下一条记录有下一个编号,而不是删除的编号。据我所知,没有办法这样做。您可以考虑通过添加删除标志来进行工作,然后设置删除的标志,而不是删除行。 “正确”的答案是,一旦删除了一行,就不应该引用它。您可以添加外键,以确保数据库

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


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

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

据我所知,没有办法这样做。您可以考虑通过添加删除标志来进行工作,然后设置删除的标志,而不是删除行。

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

Mysql手册:

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


除了MyISAM之外,引擎似乎也可能存在这种行为。在这种情况下,您可能不应该在公共访问的位置使用自动增量索引

可以从其他数据派生密钥字段,也可以使用不同的机制创建id。我以前使用过一种方法,尽管您需要了解(可能严重的)性能影响,但它是一个“keys”表,用于跟踪最后使用的键,并递增该键

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

我过去使用过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不再重复使用自动增量ID值,修复了长期存在的问题(2003年开放!!)


有关更多信息,请参阅MySQL社区管理器lefred的这篇博文:

我认为它会在重新启动数据库时重置。InnoDB会在重新启动数据库时重置。当InnoDB启动时,它会找到最高的增量,然后从那里开始。MyISAM缓存增量ID,因此不会发生这种情况。在我使用的MySQL(5.7.x)中,一旦删除了具有最高密钥的记录,next new record>立即<重用该键值。不需要重新启动数据库。我也注意到了这种行为。似乎将id用作“last record”指示符不是一个好的做法。抱歉,我只是重新阅读了您的问题,发现您并不担心其他db元素引用已删除的行,而是“在db外部”引用。这可能表示用户将包含url中id的链接添加到书签中,然后当他们重用该书签时,不是没有得到结果,而是得到错误的结果。在这种情况下,我想说删除标志可能是最好的方式,并更改您的表示逻辑,以便在访问数据时显示适当的“已删除”用户消息。删除标志的问题是,您必须记住在访问数据的每个查询中使用它作为约束(在我的例子中有很多),然后考虑任何其他方面的索引暗示,AutoMyLoad对我的目的很好,并且使插入查询保持简单。我想我将使用“altertable x AUTO_INCREMENT=y”构造强制删除标识。