MySQL如何改ID_MySQL表主键ID修改与自增重置教程

坦白说,更改MySQL中的主键ID是一项技术活,但风险也不低。
我们建议您在直接继续之前考虑替代方案。

让我们对此进行扩展,首先讨论最重要的事情。
重置自增ID有两种方法,但适用的场景完全不同。
清除部分数据后,使用ALTER TABLE AUTO_INCRMENT=N调整起始点。
例如,去年我们运行了一个电子商务测试表。
删除8 000条数据后,直接AUTO_INCRMENT=1 0000。
这可以为您省去一些麻烦,但是您需要确保 N 比您当前的最大 ID 大 1 否则,MySQL 将忽略它。
还有一点:TRUNCATE TABLE是一个暴力玩家。
清除数据并将自增ID重置为1 适用于临时表或日志表。
但是,如果您的数据逃逸,请不要寻找 MySQL。
上次有同学删除了生产日志表,哭都来不及了。

还有另一个重要的细节。
也就是说,直接更改现有 ID 的风险相当于拆除炸弹。
主键是外键的锚点。
去年,订单表ID发生了变化。
结果,子表中的所有外键都被孤立,业务逻辑被破坏。
更令人困惑的是,当你修改大表上的索引时,需要锁定表。
一开始以为在线DDL就可以解决问题,后来发现在线服务宕机了3 个小时。
等等,还有一件事:回滚?它不存在。

建议您尝试添加业务字段,例如在users表中添加user_uuid,在不改变主键的情况下满足唯一性要求。
如果这不起作用,请尝试迁移数据、备份数据、创建新表、同步 ID 和更新外键。
该过程虽然繁琐但安全。
但是,如果外键使用ON UPDATE CASCADE,则更改主表ID会容易得多,并且子表也会自动更改。

最后,让我提醒您一个简单的陷阱。
当更改标识列的定义时(例如,从 INT 更改为 BIGINT),请记住新类型必须与旧数据兼容。
上次有同学想改成UNSIGNED,结果直接截断了数据中的负数。
我花了3 天时间才找到它。

mysql数据库表清空后id如何从1开始自增

上周有客户问我为什么清空MySQL表后ID增量值没有从1 开始?这其实很常见。
我告诉他,要解决这个问题,我们首先要知道MySQL有一个命令叫TRUNCATE,它是用来截断表名的;通过此操作,表 ID 在递增时将自动返回到 1
但是,这个技巧有时不起作用。
例如,如果您发现执行 TRUNCATE 命令失败,可能是因为您的表与其他表相关,例如通过外键约束。
这时需要仔细检查是否因为对应表的问题而导致操作受到限制。

我记得,我自己也曾踩过这个坑。
表A与表B关联,我清除表A时,直接使用TRUNCATE命令,但失败。
后来查了一下,发现是因为A表和B表之间存在外键约束,我得先取消A表和B表的外键关系,然后再清空A表,然后执行TRUNCATE命令成功。

所以,总之,如果你想在清空MySQL表后将ID加1 ,要么直接使用TRUNCATE命令,要么检查并取消对应的表关系。
不管怎样,你得弄清楚,这个技巧相当管用。
我还在想这个问题,不知道有没有更快的方法。