45

尝试添加唯一键时,我在 MySQL 上遇到错误。这就是我想要做的。我有一个名为“unique_id”的列,它是 VARCHAR(100)。表上没有定义索引。我收到此错误:

#1062 - Duplicate entry '' for key 'unique_id' 

当我尝试添加唯一键时。这是我如何在 phpMyAdmin 中进行设置的屏幕截图:

在此处输入图像描述

这是 phpMyAdmin 生成的 MySQL 查询:

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

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

4

6 回答 6

54

错误说明了一切:

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=''

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

于 2013-07-24T01:32:26.923 回答
20

这是我第三次寻找这个问题的解决方案,所以作为参考,我在这里发布答案。

根据数据,我们可以将 IGNORE 关键字与 Alter 命令一起使用。如果指定了 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;

请注意,如果您有外键约束,这将不起作用,您必须先删除这些约束,然后再将它们添加回来。

于 2014-05-02T06:04:03.957 回答
6

制作unique_id NULLNOT NULL它将解决您的问题

于 2016-03-21T20:55:45.093 回答
4

因为你在查询中写了,unique_id 不是 NULL 并且前面的行都是 null 并且你希望这个列是唯一的,然后在运行这个查询之后,你有几行具有相同的值,这意味着这个列不是唯一的,那么您必须在查询中将 unique_id NOT NULL 更改为 unique_id NULL。

于 2018-04-10T17:38:28.800 回答
3
select ID from wind_archive 
where ID not in (select max(ID) from wind_archive group by unique_id) 

这是您在成功添加唯一键之前应该从表中删除的内容。这也适用于添加具有 2 列或更多列的唯一键。如 -

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
);
于 2017-04-13T10:46:06.747 回答
0

在尝试将新列添加为唯一“之后”时,我遇到了同样的错误(重复条目''键'unique_id')我已经创建了一个只包含博物馆名称的表。我想返回并为每个博物馆名称添加一个唯一代码,以便一次插入一个代码值。我的餐桌计划很差。我的解决方案是添加新列而不使其唯一;然后每次为每个代码输入一行数据;然后更改列结构以使其对于以后的条目是唯一的。幸运的是只有 10 行。

于 2017-08-05T15:16:51.330 回答