重置自动增量有什么危害吗?

TIM*_*MEX 6 mysql database auto-increment

我有1亿行,而且它太大了.我看到很多差距.(因为我删除,添加,删除,添加.)

我想用自动增量填补这些空白.如果我重置它..有任何harM吗?

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

mysql> ALTER TABLE tbl AUTO_INCREMENT = 1;
Run Code Online (Sandbox Code Playgroud)

Thi*_*ilo 9

可能非常危险,因为您可以再次获得已经在使用中的数字.

你建议重新将序列重置为1.它只会产生1,2,3,4,5,6,7,......等等,无论这些数字是否存在差距.

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

再想一想间隙存在导致的真正问题.通常它只是一个美学问题.

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


mar*_*ton 6

FWIW ...根据MySQL文档申请

ALTER TABLE tbl AUTO_INCREMENT = 1
Run Code Online (Sandbox Code Playgroud)

其中tbl包含了现有的数据应该没有任何效果:

要更改要用于新行的AUTO_INCREMENT计数器的值,请执行以下操作:

ALTER TABLE t2 AUTO_INCREMENT = value;

您不能将计数器重置为小于或等于任何已使用的值.对于MyISAM,如果该值小于或等于AUTO_INCREMENT列中当前的最大值,则该值将重置为当前最大值加1.对于InnoDB,如果该值小于列中的当前最大值,则不会发生错误,并且不会更改当前序列值.

我运行了一个小测试,确认了MyISAM表.

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


Sas*_*gov 5

这样做你可能无法获得任何收益,而且你可以通过覆盖行轻松搞砸你的应用程序,因为你要重置ID的计数.(换句话说,下次插入一行时,它会用ID覆盖行1,然后2等等.)填补空白会得到什么?如果数字太大,只需将其更改为更大的数字(例如BIGINT).


编辑:我纠正了.它根本不会做任何事情,这支持我的观点,你应该只将列的类型更改为更大的整数类型.a的最大可能值BIGINT是2 ^ 64,超过18 quintillion.如果你现在只有1亿行,那么在可预见的未来这应该是充足的.