#1062 - 在尝试添加唯一键(MySQL)时出现重复条目''的错误 (注:该内容为一个提问标题,无需回答)

48
在尝试添加唯一键时,我在MySQL上遇到了错误。以下是我的尝试步骤: 我有一个名为“unique_id”的列,其类型为VARCHAR(100)。在表上未定义任何索引。我收到以下错误消息:
#1062 - Duplicate entry '' for key 'unique_id' 

当我尝试添加一个唯一键时,在phpMyAdmin中设置如下所示:

enter image description here

这是phpMyAdmin生成的MySQL查询:

ALTER TABLE  `wind_archive` ADD  `unique_id` VARCHAR( 100 ) NOT NULL FIRST ,
ADD UNIQUE (
`unique_id`
)

我曾经遇到过这个问题,但从未解决过,所以我只能从头开始重建表格。不幸的是,在这种情况下,我无法这样做,因为表格中已经有很多条目。感谢您的帮助!

6个回答

56

错误已经说明了一切:

Duplicate entry '' 

执行以下查询:

SELECT unique_id,COUNT(unique_id)
FROM yourtblname
GROUP BY unique_id
HAVING COUNT(unique_id) >1

这个查询也会显示您遇到的问题

SELECT *
FROM yourtblname
WHERE unique_id=''

这将向您展示哪些数值存在重复项。您正在尝试在具有重复项的字段上创建唯一索引。您需要先解决重复数据,然后再添加索引。


2
哦,好的,我现在明白了。是的,这实际上是我在索引上创建“唯一”值的原因。我不知道错误确切的含义(我想太多了)。非常感谢,这让我朝着正确的方向前进! - MillerMedia
1
由于您正在向一个已经填充了数据的表中添加一个唯一列,因此它会抛出错误,因为它将尝试在每一行中复制值“ ”。 如果您尝试将此列添加到空表中,则不会有任何问题。 - Varun Nath

22

这是我第三次寻找解决此问题的方法,因此为了参考,我在此发布答案。

根据数据,我们可以在Alter命令中使用IGNORE关键字。如果指定了IGNORE,则仅使用具有唯一键上重复项的第一行。其他冲突的行将被删除。不正确的值将被截断为最接近的匹配可接受值。

MySQL对IGNORE关键字的扩展似乎在某些版本的MySQL的InnoDB版本中存在错误

您始终可以转换为MyISAM,IGNORE-ADD索引,然后转换回InnoDB。

ALTER TABLE table ENGINE MyISAM;
ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field);
ALTER TABLE table ENGINE InnoDB;
请注意,如果您有外键约束,则此方法将不起作用,您需要先删除这些约束,然后稍后再添加回去。

Note, if you have Foreign Key constraints this will not work, you will have to remove those first, and add them back later.


返回结果:

请注意,如果您有外键约束,则此方法将不起作用,您需要先删除这些约束,然后稍后再添加回去。


7

unique_idNOT NULL 改为 NULL,这样就可以解决你的问题。


4

由于您在查询中写入了unique_id NOT NULL的条件,并且之前所有行的unique_id都为null,您希望此列成为唯一值。但是运行此查询后,您会发现有多行具有相同的值,这表明该列不是唯一的。因此,您需要在查询中将unique_id NOT NULL更改为unique_id NULL。


正确。那是因为其他字段值为空,所以当我将其设置为NULL时,可以成功添加而不显示错误消息。感谢提示 :) - Jodyshop

4
select ID from wind_archive 
where ID not in (select max(ID) from wind_archive group by unique_id) 

在成功添加唯一键之前,您应该从表中删除以下内容。这也适用于使用两个或更多列添加唯一键。例如 -

delete from wind_archive 
where ID in (
select * from (select ID from wind_archive where ID not in (
select max(ID) from wind_archive group by lastName, firstName
) ORDER BY ID
) AS p
);

如果有一些行的ID不等于GROUP BY unique_id的MAX(ID),那么它们都是重复的; 相反,假设没有重复,所有的ID与GROUP BY unique_id应该等于自己的MAX(ID),因为它本身就是这样。 - Ning Yu Fisher

0

当我尝试添加一个新列作为唯一列时,我遇到了相同的错误(Duplicate entry '' for key 'unique_id'),而此前我已经创建了一个仅包含博物馆名称的表格。我想回去为每个博物馆名称添加一个唯一代码,并打算逐个插入代码值。这是我在表格规划上的失误。

我的解决方案是先添加新列而不将其设置为唯一;然后逐行输入每个代码的数据;最后更改列结构以使其对未来的条目唯一。幸运的是只有10行。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接