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
覆盖该行,然后用ID2
等)填补空白会有什么好处?如果数字太大,只需将其更改为a(例如BIGINT
)
编辑:我被纠正了。它不会做任何事情,这支持我的观点,即您应该将列的类型更改为更大的整数类型。
BIGINT
的最大可能值为2^64,即超过18/5百万。如果你现在只有1亿行,那么在可预见的未来这应该足够了。我同意musicfreak。。。整数(int(10)
)的最大值为4294967295(无符号)。如果您需要更高,切换到BIGINT
会使您达到18446744073709551615。FWIW。。。根据申请
如果tbl
包含现有数据,则不应影响:
要更改
自动递增计数器用于
新行,请执行以下操作:
更改表t2自动增量=值
无法将计数器重置为默认值
小于或等于任何
已经用过了。对于MyISAM,如果
该值小于或等于
当前在中的最大值
“自动增量”列,值为
重置为当前最大值加1。
对于InnoDB,如果该值小于
中的当前最大值
列,则不会发生错误,并且
当前序列值未更改
我对MyISAM表进行了一个小测试,证实了这一点
所以对你的问题的答案是:没有伤害,也不会填补空白。正如其他响应者所说:数据类型的更改看起来是最不痛苦的选择。因为您无法更改下一个自动增量值,所以您有其他选择。数据类型切换可以完成,但对我来说似乎有点不安,因为您实际上没有那么多行。您必须确保您的代码能够处理这么大的ID,这对您来说可能很难,也可能不难 你能做很多停机时间吗?如果是,我可以想到两个选择:
当然,这两者都忽略了引用完整性。我假设这不是问题(不用作外键的日志语句,或类似的语句)。如果存在间隙,这真的很重要吗 如果您真的想返回并填充它们,您可以始终关闭自动递增,并在每次插入行时手动扫描下一个可用id——当然,记住锁定表以避免竞争条件。但要做的工作很多,收获不多
你真的需要代理密钥吗?根据数据(您没有提到模式),您可能会找到一个自然键。如果数字太大,该怎么办?如果数字太大,有两种情况(都很糟糕):由于间隙太大,或者即使没有间隙也太大。在第二种情况下,除了重新思考您的模式之外,您别无选择。在第一种情况下,您可以删除并重新创建整个列。但这将重新编号每一行,这可能也是不可能的。重复:不,您不会覆盖任何内容,只有主键可以自动递增,因此如果您能够做到这一点,您将得到一个重复键错误。除非您进行大量的删除和插入,我认为在需要大于无符号int之前,应该先让数据库崩溃。
ALTER TABLE tbl AUTO_INCREMENT = 1