我有一亿行,而且越来越大了。我看到了很多差距。(因为我删除、添加、删除、添加。)
我想用自动增量来填补这些空白。如果我真的重置了it..is,有没有harM?
如果我这样做,它会填补空白吗?:
mysql> ALTER TABLE tbl AUTO_INCREMENT = 1;发布于 2010-01-21 09:11:00
这可能非常危险,因为您可以再次获取已在使用的数字。
您建议的是再次将序列重置为1。它只会产生1,2,3,4,5,6,7,..以此类推,不管这些数字是否在空白处。
更新:根据马丁的回答,由于涉及的危险,MySQL甚至不会让你这么做。它会将计数器至少重置为当前值+ 1。
再想一想,差距的存在会导致什么真正的问题。通常这只是一个美学问题。
如果数字变得太大,请切换到更大的数据类型(bigint应该足够了)。
发布于 2010-01-21 09:31:51
FWIW根据MySQL docs申请
ALTER TABLE tbl AUTO_INCREMENT = 1tbl包含现有数据的位置应该不会有任何影响:
要更改用于新行的AUTO_INCREMENT计数器的值,请执行以下操作:
ALTER TABLE t2 AUTO_INCREMENT = value;
不能将计数器重置为小于或等于已使用的任何值。对于MyISAM,如果该值小于或等于AUTO_INCREMENT列中当前的最大值,则将该值重置为当前最大值加1。对于InnoDB,如果该值小于列中的当前最大值,则不会发生错误,并且不会更改当前序列值。
我为一个MyISAM表运行了一个小测试,确认了这一点。
因此,对你的问题的答案是:没有坏处,也不会填补空白。正如其他应答者所说:数据类型的改变看起来是最不痛苦的选择。
发布于 2010-01-21 09:14:10
这样做可能不会带来任何好处,而且很容易通过覆盖行来搞砸您的应用程序,因为您将重置ID的计数。(换句话说,下次插入一行时,它将用ID 1覆盖该行,然后用2覆盖该行,依此类推。)您将从填补这些空白中获得什么?如果数字太大,只需将其更改为larger number (如BIGINT)。
编辑:我站起来了。它根本不会做任何事情,这支持我的观点,即您应该将列的类型更改为更大的整数类型。BIGINT的最大可能值为2^64,这是超过18 quintillion的。如果您目前只有1亿行,那么在可预见的未来,这应该是足够的。
https://stackoverflow.com/questions/2106237
复制相似问题