如何重置一个表的AUTO_INCREMENT (自增主键)?

【 TiDB 使用环境】生产环境 /测试/ Poc
测试环境
【 TiDB 版本】
V4.0.9
【复现路径】做过哪些操作出现的问题
应该是有开发直接插入了最大的值到自增ID列,把 AUTO_INCREMENT列的值更新为最大值,我们怎么重置表的AUTO_INCREMENT 值。
【遇到的问题:问题现象及影响】
表结构如下:

CREATE TABLE dcs_option_20230111( option_idint(11) NOT NULL AUTO_INCREMENT, survey_idint(11) DEFAULT '0', template_idint(11) DEFAULT '0' COMMENT '模板id', question_idint(11) DEFAULT '0', option_valuetext DEFAULT NULL, option_identity varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '' COMMENT '选项标识', PRIMARY KEY (option_id), KEY question_id (question_id), KEY survey_id (survey_id), KEY option_identity (option_identity) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

有开发做了指定了option_id的插入了一条SQL,导致option_id变为最大值,不指定数值无法插入。
插入语句如下:
INSERT INTO dcs_option_20230111 (option_id,survey_id, template_id, question_id, option_value) VALUES ('2147483647','12689831','0','169791211','选项1');

此时的建表语句变为:
CREATE TABLE dcs_option_20230111( option_idint(11) NOT NULL AUTO_INCREMENT, survey_idint(11) DEFAULT '0', template_idint(11) DEFAULT '0' COMMENT '模板id', question_idint(11) DEFAULT '0', option_valuetext DEFAULT NULL, option_identity varchar(255) CHARACTER SET utf8 COLLATE utf8_bin DEFAULT '' COMMENT '选项标识', PRIMARY KEY (option_id), KEY question_id (question_id), KEY survey_id (survey_id), KEY option_identity (option_identity) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin AUTO_INCREMENT=2147513648
此时我们不指定option_id无法插入数据,并报如下的错:
错误代码: 1062 Duplicate entry '2147483647' for key 'PRIMARY'

使用SQL:
ALTER TABLE dcs_option_20230111 AUTO_INCREMENT= 566167158; 并且重启了TiDB组件,建表语句也还是原本的最大值,能有其他什么SQL或者办法重置该值吗?

【资源配置】
【附件:截图/日志/监控】

好像没办法,翻了文档,做了几个测试都不成功。 alter table 。。auto_increment 会提示warning。而且show create table 看到的auto_increment好像也不是当前的自增值。

1 个赞

只能往大调整 auto_increment 的值,调小值是不生效的。如果一定要重置,建议全部重置,避免主键 Key 冲突。或者另外针对主键 Key 冲突和已经存在 option_id 做一下筛选,再遇到冲突报错时候,业务指定写入一个没有冲突的 key 解决这个报错。

CREATE TABLE dcs_option_20230111( option_idint(11) NOT NULL AUTO_INCREMENT,

把 int 改成 bigint

如果id没有意义,可以新建表,把除了id数据导入新表,然后rename 表名

谢谢各位了,明白了,就是除了修改字段类型,或者重新导入,暂时没有更好的办法了。

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。