我在尝试添加UNIQUE KEY时遇到错误。这就是我想要做的。我有一个名为'unique_id'的列,它是VARCHAR(100)。表中没有定义索引。我收到了这个错误:
#1062 - Duplicate entry '' for key 'unique_id'
当我尝试添加UNIQUE键时。这是我在phpMyAdmin中设置它的截图:
这是由phpMyAdmin生成的MySQL查询:
ALTER TABLE `wind_archive` ADD `unique_id` VARCHAR( 100 ) NOT NULL FIRST ,
ADD UNIQUE (
`unique_id`
)
我过去遇到过这个问题但从未解决过,所以我只是从头开始重建了这个表。不幸的是,在这种情况下我不能这样做,因为表中已有很多条目。谢谢你的帮助!
答案 0 :(得分:33)
错误说明了一切:
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=''
这将显示存在重复值的位置。您正尝试在具有重复项的字段上创建唯一索引。您需要先解决重复数据,然后添加索引。
答案 1 :(得分:14)
这是我第三次寻找这个问题的解决方案,所以作为参考,我在这里发布答案。
根据数据,我们可以使用带有Alter命令的IGNORE关键字。如果指定了IGNORE,则只对第一行使用唯一键上具有重复项的行,将删除其他冲突行。不正确的值将被截断为最接近的匹配可接受值。
MySQL的IGNORE
关键字扩展似乎在某个版本的MySQL上有bug in the InnoDB version。
您可以随时转换为MyISAM,IGNORE-ADD索引,然后转换回InnoDB
ALTER TABLE table ENGINE MyISAM;
ALTER IGNORE TABLE table ADD UNIQUE INDEX dupidx (field);
ALTER TABLE table ENGINE InnoDB;
注意,如果您有外键约束,这将无效,您必须先删除它们,然后稍后再添加。
答案 2 :(得分:2)
从unique_id
获取NULL
NOT NULL
,它将解决您的问题
答案 3 :(得分:1)
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
);
答案 4 :(得分:0)
当我尝试将新列添加为唯一“之后”我已经创建了一个仅包含博物馆名称的表时,我得到了同样的错误(重复条目''用于键'unique_id')。我想回去为每个博物馆名称添加一个唯一的代码,目的是一次插入一个代码值。我的表计划很糟糕。 我的解决方案是添加新列而不使其独特;然后一次一行输入每个代码的数据;然后更改列结构,使其在以后的条目中是唯一的。幸运的是只有10排。
答案 5 :(得分:0)
因为您在查询中写入,unique_id是NOT NULL并且之前的行都是null并且您希望此列是唯一的,然后在运行此查询之后,您有多个具有相同值的行,这意味着此列是不唯一,那么你必须在查询中将unique_id NOT NULL更改为unique_id NULL。