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

What is the purpose of re-setting AUTO_INCREMENT in MySQL?

我遇到过一些人,在从 table 执行删除行后,还重置了主键列的 AUTO_INCREMENT table 重新编号所有值,就好像它们再次从 1 开始(或任何初始起点)。

我的问题是,除了偏好之外,是否有这样做的具体原因?比如,如果您不重置自动增量并保持原样,是否会对数据库或未来的查询产生不利影响?如果有,有人可以提供一个示例,其中有必要重置 AUTO_INCREMENT?

谢谢!

我认为 没有必要 重置 auto_increment,除非你 运行 超出了值。

自动增量经常被重置的一种情况是当所有行都被删除时。如果您使用 truncate table,那么自动增量值会自动重置。没有 where 子句的 delete 并不总是会发生这种情况,因此为了保持一致性,您可能需要重新设置它。

另一种情况是大型插入失败,尤其是反复失败时。您可能不想要真正大的差距。

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

不过,一般来说,不建议重新设置自动增量。

重置自动增量通常有助于组织,如果删除了 id 6 和 60 之间的行,您可以看到 id 6 和 60 之间没有间隙。

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

在我看来,只需 运行在测试后对整个内容进行分类,然后将正确的信息植入数据库。如果是生产,让它 运行 自由自在,它可能会造成更大的伤害而没有有益的输出

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

如果您打算稍后修补数据(例如,如果您从旧备份恢复并希望恢复一些丢失的数据但需要尽快恢复服务)或当您从单个活动服务器迁移到多个主节点时。但在这些情况下,您将计数器设置为比当前使用的值更高的值 - 而不是将其重置回开始。

如果您存在环绕数字的风险,那么您可能 picked the wrong data type 的自动递增属性 - 更改数据类型是解决问题的正确方法,不删除数据并将计数器重置为 0。

重置 auto-inc 是一个不常见的操作。正常的日常工作,就让它一直递增吧。

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

另一种情况是创建存档时 tables。假设你有一个巨大的table,并且你想高效地清空数据(不是使用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;

上述系列语句允许您以原子方式将新的空 table 洗牌到位,因此您的应用可以继续使用它习惯的名称写入 table。您在新 table 中重置的 auto-inc 值应该高于旧 table 中的最大 id 值,加上一些 comfortable 间隙以避免在两者之间的时刻重叠声明。

不幸的是,我见过这种行为。根据我的观察,由于技术原因,它 不是 - 它更接近强迫症。

有些人真的不喜欢 ID 列中的空白 - 他们喜欢每条记录平滑增加 1 的想法。他们正在做的一些手动数据操作搞砸了这个想法并不令人愉快 - 所以他们经历了一些箍以确保他们不会造成数字差距。

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