因此,当尝试向字段添加自动增量时,它会出现#1062 - 密钥1的重复条目“1”。我已经尝试删除主键并重新添加它并且工作正常(如果有重复项,我认为不会这样做?)
但是当我尝试向字段添加自动增量时,它会抛出错误。它为我提供了一个浏览选项,它运行以下SQL:
SELECT *
FROM `myTbl`
WHERE CONCAT_WS( "-", 11 ) = "1"
ORDER BY 11
LIMIT 0 , 30
然而,这会返回一个空的结果集..表明没有重复项。所以,如果没有重复,我怎么能不添加自动增量?
答案 0 :(得分:21)
此列中是否包含值0
或NULL
的行? ALTER TABLE
可以导致主键重新排序。在密钥为0的情况下,MySQL将尝试为其赋值1,如果密钥1已经存在,则将失败。
尝试将列中的任何0
或NULL
值更改为更高(和未使用)的值。
答案 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;