#1062 - 密钥1的重复条目“1” - 未找到重复条目

时间:2011-11-03 13:09:51

标签: mysql sql phpmyadmin

因此,当尝试向字段添加自动增量时,它会出现#1062 - 密钥1的重复条目“1”。我已经尝试删除主键并重新添加它并且工作正常(如果有重复项,我认为不会这样做?)

但是当我尝试向字段添加自动增量时,它会抛出错误。它为我提供了一个浏览选项,它运行以下SQL:

SELECT *
FROM `myTbl`
WHERE CONCAT_WS( "-", 11 ) = "1"
ORDER BY 11
LIMIT 0 , 30

然而,这会返回一个空的结果集..表明没有重复项。所以,如果没有重复,我怎么能不添加自动增量?

3 个答案:

答案 0 :(得分:21)

此列中是否包含值0NULL的行? ALTER TABLE可以导致主键重新排序。在密钥为0的情况下,MySQL将尝试为其赋值1,如果密钥1已经存在,则将失败。

尝试将列中的任何0NULL值更改为更高(和未使用)的值。

答案 1 :(得分:3)

如果您可以更改表格中的数据,Michael Mior的答案将有效。但是,还有一种解决方法可以让您保持数据的完整性(我在MySQL 5.5上测试了这一点)。请记住,出于这个原因,在MySQL中将零值作为主键并不是推荐的做法。如果你能摆脱零,那就去做吧。

插入零时禁用自动值生成:

SET SQL_MODE=NO_AUTO_VALUE_ON_ZERO;

将AUTO_INCREMENT添加到您的列:

ALTER TABLE ... AUTO_INCREMENT;

重新启用自动值生成:

SET SQL_MODE='';

显然,不允许在整个操作期间向表中插入数据。否则,列中将出现不需要的零值。

答案 2 :(得分:0)

SELECT *                           <<-- Select * is an anti-pattern
FROM myTbl 
WHERE CONCAT_WS( "-", 11 ) = "1"   <<-- You are not selecting a column
ORDER BY 11                        <<-- This however does refer to a column.
LIMIT 30 OFFSET 0

将查询重写为

SELECT field1, field2, field3, ...., field11
FROM myTbl 
WHERE COALESCE(field1, field2, field3, field11) = '1'
ORDER BY field11               
LIMIT 30 OFFSET 0

如果要插入行使用代码,请执行以下操作:

INSERT INTO table1 (/*do not list the PK!*/ field2, field3, field4) 
  VALUES ('a', 'test' ,'b' ,'example'); 

如果要选择所有重复行,请使用:

SELECT id, count(*) as duplicate_count
FROM table1
GROUP BY id
HAVING duplicate_count > 1

您需要更新列为重复的ID。

另一个选择是添加一个额外的列并删除旧的PK。

ALTER TABLE table1 ADD COLUMN new_id unsigned integer not null auto_increment primary key;
ALTER TABLE table1 DROP COLUMN id;
ALTER TABLE table1 CHANGE COLUMN newid id;