在MySQL中重新设置AUTO_INCREMENT的目的是什么?

时间:2018-04-16 15:08:59

标签: mysql sql innodb

我遇到这样一个事实,即某些人在从表中删除行后,还重置该表的主键列的 AUTO_INCREMENT ,以重新编号所有值,就像它们一样从1开始(或初始起点)。

我的问题是,除了偏好之外,有没有具体的理由这样做?如果您没有重置自动增量并且保持原样,是否会对数据库或将来的查询产生任何不利影响?如果有,有人可以举例说明需要重置 AUTO_INCREMENT 吗?

谢谢!

5 个答案:

答案 0 :(得分:3)

我不认为重置auto_increment是必要的,除非你的值不足。

经常重置自动增量的一种情况是删除所有行。如果使用truncate table,则会自动重置自动增量值。对于没有delete子句的where,情况并非总是如此,因此为了保持一致性,您可能需要重置它。

另一种情况是大型插入失败,特别是如果重复失败。你可能不想要真正的大差距。

当您移动表格时,您可能希望保留原始ID值。因此,基本上,您忽略插入时的自动增量。但是,之后,您可能希望将自动值设置为与其他系统一致。

但一般情况下,不建议重置自动增量。

答案 1 :(得分:2)

重置auto-inc是一种不常见的操作。在正常的日常工作中,只需让它继续增加。

我已经在用于自动化测试的MySQL实例中重置了auto-inc。给定的一组表一遍又一遍地加载数据,然后删除其测试数据。如果他们要在结果中查找特定值,重置auto-inc可能是使测试可重复的最佳方式。

另一种情况是创建存档表时。假设您有一个庞大的表,并且您希望有效地清空数据(不使用DELETE),但是您希望存档数据,并且希望新数据使用高于旧数据的id值。

CREATE TABLE mytable_new LIKE mytable;

SELECT AUTO_INCREMENT FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_NAME='mytable';

ALTER TABLE mytable_new AUTO_INCREMENT = /* value + 10000 */;

RENAME TABLE mytable TO mytable_archive, mytable_new TO mytable;

上面的一系列语句允许您以原子方式将新的空表放入原位,因此您的应用程序可以继续使用以前的名称写入表中。您在新表中重置的auto-inc值应该是一个高于旧表中max id值的值,加上一些舒适的间隙,以避免在语句之间的重叠期间重叠。

答案 2 :(得分:2)

不幸的是,我已经看到了这种行为。从我观察到的情况来看,由于技术原因,它不是 - 它更接近强迫症。

有些人真的不喜欢ID列中的空白 - 他们喜欢每个记录平滑增加1的想法。他们正在进行一些手动数据操作的想法并不令人愉快 - 因此他们会通过一些环节来确保它们不会造成数据上的差距。

但是,是的,这是一种可怕的做法。它只是要求数据完整性问题。

答案 3 :(得分:1)

重新设置自动增量通常有助于组织,如果已删除之间的行,则可以看到ID 6和60之间没有差距。

但是,您应该谨慎使用重置自动增量,因为很可能,您的代码将依赖于特定的ID来获取某些信息。

在我看来,只需在测试后截断整个事情,并使用正确的信息为数据库播种。如果它的生产,让它疯狂和自由,它可能会造成更多的伤害,没有有益的输出

答案 4 :(得分:1)

根据对abr的回答的评论,假设自动增量ID是连续的(甚至连续的)不仅仅是一个坏主意,它是一个危险的。

如果您打算稍后修补数据,可能有充分的理由故意在已分配的ID中创建间隙(例如,如果您已从旧备份恢复并期望恢复某些丢失的数据但需要恢复服务asap)或从单个活动服务器迁移到多个主节点时。但在这些情况下,您将计数器设置为比当前使用的值更高的值 - 而不是将其重置为开始。

如果您有可能将数字包围起来,那么您的自动增量属性可能picked the wrong data type - 更改数据类型是解决问题的正确方法,而不是删除数据并将计数器重置为0.