mysql报错ERROR 1062 (23000): Duplicate entry '0' for key 'PRIMARY'

发布时间 2023-07-08 12:43:09作者: Realife

创建表语句:

CREATE TABLE `mytable` (
  `id` int(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
  `col` varchar(50) NOT NULL DEFAULT '未知',
  `col1` int(11) NOT NULL DEFAULT '未知',
  `col2` varchar(45) DEFAULT NULL,
  `col3` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP
);
ALTER TABLE mytable MODIFY id int(11) COMMENT '自增长序列';
ALTER TABLE mytable MODIFY col varchar(50) COMMENT '学生姓名';
ALTER TABLE mytable MODIFY col1 int(11) COMMENT '学生年龄';
ALTER TABLE mytable MODIFY col2 varchar(45) COMMENT '学生班级';
ALTER TABLE mytable MODIFY col3 timestamp COMMENT '入学时间';

1、报错
执行插入数据语句,出现如下错误信息:

insert into mytable(col,col1,col2) values('张三',15,'高一1班')
,('李四',16,'高二2班')
,('王五',17,'高三3班');

ERROR 1062 (23000): Duplicate entry '0' for key 'PRIMARY'

2、原因分析
查看结果插入第一条数据,0 张三 15 高一1班 2023-07-08 12:06:34
主键为0,以后再增加数据,就出现如上错误,看信息是以后每次增加数据,其主键都为0,所以导致这个错误。

深入分析后发现是ALTER TABLE mytable MODIFY id int(11) COMMENT '自增长序列';语句问题。该语句执行后id列将被修改为INT(11)数据类型,并添加了一个注释(COMMENT)'自增长序列'。
AUTO_INCREMENT被覆盖,而int(11)初始值为0,如果不为空默认值每次都将添加0,故而出现上述错误。

3、解决方法
ALTER TABLE mytable MODIFY id int(11) AUTO_INCREMENT COMMENT '自增长序列';

4、总结
AUTO_INCREMENT是MySQL中用于自动递增生成唯一标识符的属性。

如果出现AUTO_INCREMENT被覆盖,可能是由于以下原因之一:

1、使用了ALTER TABLE语句修改了表结构:如果使用ALTER TABLE语句修改了表结构,可能会导致AUTO_INCREMENT属性被重置或删除。在修改表结构时,需要特别注意是否保留了AUTO_INCREMENT属性。

2、手动插入了具有指定ID值的行:如果手动插入了具有指定ID值的行,并且该ID与AUTO_INCREMENT的计数器冲突,那么下一个AUTO_INCREMENT的值将会从该指定ID值开始。

为了解决AUTO_INCREMENT被覆盖的问题,可以尝试以下方法:

1、使用ALTER TABLE语句重新添加AUTO_INCREMENT属性:可以使用ALTER TABLE语句来为表添加AUTO_INCREMENT属性。例如:

ALTER TABLE 表名 MODIFY 列名 INT AUTO_INCREMENT;
这将为指定的列重新添加AUTO_INCREMENT属性。

2、清空表并重新设定AUTO_INCREMENT值:可以首先清空表中的所有数据,然后使用ALTER TABLE语句设置AUTO_INCREMENT的初始值。例如:

TRUNCATE TABLE 表名;
ALTER TABLE 表名 AUTO_INCREMENT = 新的初始值;
这将清空表数据并重新设定AUTO_INCREMENT的初始值为指定的值。

请注意,在执行任何表结构修改操作或涉及数据变动的操作前,强烈建议备份重要的数据。