问题场景
当表的自增主键达到 INT 最大值(约 21 亿)时,插入会报错:Duplicate entry '2147483647' for key 'PRIMARY'。
解决方案
方案一:修改字段类型(推荐)
ALTER TABLE your_table MODIFY id BIGINT UNSIGNED AUTO_INCREMENT;BIGINT 最大值为 1844 亿亿,几乎不会用尽。注意此操作会锁表,建议在低峰期执行。
方案二:变更表引擎
如果是 MyISAM 引擎,可以改为 InnoDB,但无法根治。
方案三:重置自增值(临时方案)
如果因删除数据导致浪费,可重置:
ALTER TABLE your_table AUTO_INCREMENT = 1;但若当前值已接近最大值,重置会引发冲突,不适用于溢出场景。
方案四:分布式 ID
如果预估数据量极大(如日志表),可在应用层使用 雪花算法(Snowflake) 生成 64 位 ID,彻底摆脱数据库自增限制。
预防建议
- 新建表时默认使用
BIGINT,避免后期改造痛苦 - 监控表自增值:
SELECT AUTO_INCREMENT FROM information_schema.TABLES WHERE TABLE_NAME = 'your_table'
提前规划可以避免这种“爆表”危机。
