我遇到这样一个事实,即某些人在从表中删除行后,还重置该表的主键列的 AUTO_INCREMENT ,以重新编号所有值,就像它们一样从1开始(或初始起点)。
我的问题是,除了偏好之外,有没有具体的理由这样做?如果您没有重置自动增量并且保持原样,是否会对数据库或将来的查询产生任何不利影响?如果有,有人可以举例说明需要重置 AUTO_INCREMENT 吗?
谢谢!
答案 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.