Mysql 重置自动增量是否有任何危害?

Mysql 重置自动增量是否有任何危害?,mysql,database,auto-increment,Mysql,Database,Auto Increment,我有一亿排,而且越来越大了。 我看到很多差距。(自从我删除,添加,删除,添加。) 我想用自动增量来填补这些空白。 如果我重置了它,有什么害处吗 如果我这样做,它会填补空白吗 mysql> ALTER TABLE tbl AUTO_INCREMENT = 1; 可能非常危险,因为您可以再次获得已在使用的号码 您的建议是再次将序列重置为1。它只会产生1,2,3,4,5,6,7,。。以此类推,不管这些数字是否存在差距 更新:根据Martin的回答,由于涉及的危险,MySQL甚至不会让你这么做。

我有一亿排,而且越来越大了。 我看到很多差距。(自从我删除,添加,删除,添加。)

我想用自动增量来填补这些空白。 如果我重置了它,有什么害处吗

如果我这样做,它会填补空白吗

mysql> ALTER TABLE tbl AUTO_INCREMENT = 1;

可能非常危险,因为您可以再次获得已在使用的号码

您的建议是再次将序列重置为1。它只会产生1,2,3,4,5,6,7,。。以此类推,不管这些数字是否存在差距

更新:根据Martin的回答,由于涉及的危险,MySQL甚至不会让你这么做。它会将计数器重置为至少当前值+1

再想一想缺口的存在会导致什么样的真正问题。通常这只是一个美学问题


如果数字太大,请切换到更大的数据类型(bigint应该足够大)。

这样做可能不会带来任何好处,而且很容易通过覆盖行来破坏应用程序,因为您将重置ID的计数。(换句话说,下次插入一行时,它将用ID
1
覆盖该行,然后用ID
2
等)填补空白会有什么好处?如果数字太大,只需将其更改为a(例如
BIGINT



编辑:我被纠正了。它不会做任何事情,这支持我的观点,即您应该将列的类型更改为更大的整数类型。
BIGINT
的最大可能值为2^64,即超过18/5百万。如果你现在只有1亿行,那么在可预见的未来这应该足够了。

我同意musicfreak。。。整数(
int(10)
)的最大值为4294967295(无符号)。如果您需要更高,切换到
BIGINT
会使您达到18446744073709551615。

FWIW。。。根据申请

如果
tbl
包含现有数据,则不应影响:

要更改 自动递增计数器用于 新行,请执行以下操作:

更改表t2自动增量=值

无法将计数器重置为默认值 小于或等于任何 已经用过了。对于MyISAM,如果 该值小于或等于 当前在中的最大值 “自动增量”列,值为 重置为当前最大值加1。 对于InnoDB,如果该值小于 中的当前最大值 列,则不会发生错误,并且 当前序列值未更改

我对MyISAM表进行了一个小测试,证实了这一点


所以对你的问题的答案是:没有伤害,也不会填补空白。正如其他响应者所说:数据类型的更改看起来是最不痛苦的选择。

因为您无法更改下一个自动增量值,所以您有其他选择。数据类型切换可以完成,但对我来说似乎有点不安,因为您实际上没有那么多行。您必须确保您的代码能够处理这么大的ID,这对您来说可能很难,也可能不难

你能做很多停机时间吗?如果是,我可以想到两个选择:

  • 转储/重新加载数据。你可以这样做,这样它就不会保留身份证号码。例如,您可以使用选择。。。将数据SAN ID复制到具有相同DDL的新表中。然后删除旧表并将新表重命名为旧名称。根据数据量的不同,这可能需要相当长的时间(和临时磁盘空间)

  • 您可以制作一个小程序来发出UPDATE语句来更改ID。如果你让它慢慢运行,它会随着时间的推移“整理”你的ID。然后您可以暂时停止插入(只需一两分钟),更新最后一个ID,然后重新启动它。更新最后一个ID后,您可以将自动增量值更改为下一个数字,您的孔将消失。这不会导致任何真正的停机(至少在InnoDB上),但这可能需要相当长的时间,这取决于您的程序的攻击性


  • 当然,这两者都忽略了引用完整性。我假设这不是问题(不用作外键的日志语句,或类似的语句)。

    如果存在间隙,这真的很重要吗

    如果您真的想返回并填充它们,您可以始终关闭自动递增,并在每次插入行时手动扫描下一个可用id——当然,记住锁定表以避免竞争条件。但要做的工作很多,收获不多


    你真的需要代理密钥吗?根据数据(您没有提到模式),您可能会找到一个自然键。

    如果数字太大,该怎么办?如果数字太大,有两种情况(都很糟糕):由于间隙太大,或者即使没有间隙也太大。在第二种情况下,除了重新思考您的模式之外,您别无选择。在第一种情况下,您可以删除并重新创建整个列。但这将重新编号每一行,这可能也是不可能的。重复:不,您不会覆盖任何内容,只有主键可以自动递增,因此如果您能够做到这一点,您将得到一个重复键错误。除非您进行大量的删除和插入,我认为在需要大于无符号int之前,应该先让数据库崩溃。
    ALTER TABLE tbl AUTO_INCREMENT = 1