【问题标题】:#1062 - Duplicate entry '' for key 'unique_id' When Trying to add UNIQUE KEY (MySQL)#1062 - 尝试添加 UNIQUE KEY (MySQL) 时,键 'unique_id' 的重复条目 ''
【发布时间】:2013-07-23 07:09:10
【问题描述】:

我在尝试添加唯一键时在 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`
)

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

【问题讨论】:

    标签: mysql unique unique-key


    【解决方案1】:

    错误说明了一切:

    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】:

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

    根据数据,我们可以在 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;
    

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

    【讨论】:

      【解决方案3】:

      unique_id NULLNOT NULL 变成NOT NULL,它会解决你的问题

      【讨论】:

        【解决方案4】:

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

        【讨论】:

        • 正确。那是因为其他字段值为空,所以,当我将其设为 NULL 时,它可以成功添加而不会显示错误消息。感谢您的提示:)
        【解决方案5】:
        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
        );
        

        【讨论】:

        • 如果有些行的 ID 不等于 GROUP BY unique_id 的 MAX(ID) - 它们都是重复的;相反,假设没有重复,所有带有GROUP BY unique_id的ID都应该等于它自己的MAX(ID),因为它是它自己。
        【解决方案6】:

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

        【讨论】:

          猜你喜欢
          • 2012-08-24
          • 1970-01-01
          • 2015-04-10
          • 2018-05-01
          • 2011-07-13
          • 2011-11-11
          • 2012-07-23
          • 2013-09-30
          相关资源
          最近更新 更多