【问题标题】:Find duplicate rows violating unique constraint on several fields在多个字段上查找违反唯一约束的重复行
【发布时间】:2013-12-01 03:42:11
【问题描述】:

我的 CMS 升级有以下查询:

ALTER IGNORE TABLE locales_target ADD PRIMARY KEY (language, lid, plural)

失败的原因是:“键 'PRIMARY' 的重复条目 '1-0'”。

实际上我自己在上面的查询中添加了 IGNORE,但这并没有帮助,因为 table 使用 InnoDB 引擎,因此实际上并没有忽略错误。

此页面展示了如何查找违反唯一约束的重复行: http://www.tocker.ca/2013/11/06/the-future-of-alter-table-ignore-syntax.html

SELECT GROUP_CONCAT(id), emailaddress, count(*) as count FROM users 
GROUP BY emailaddress HAVING count >= 2;

但它是针对一个独特的领域。如何使用 3 字段主键查找重复行?

编辑:原来的问题仍然存在,但这里有更多信息和更多相关问题:

1) 错误信息中的“1-0”代表什么?没有 lid == 0 的行!

2) 以下查询突出显示了部分问题:

mysql> select lid,  count(*) as count from france_locales_target group by lid having count != 1;
+------+-------+
| lid  | count |
+------+-------+
|    1 |     2 |
|    2 |     2 |
|    3 |     2 |
|    4 |     2 |
|    5 |     2 |
|    6 |     2 |
|    7 |     2 |
|    8 |     2 |
etc. etc.

现在,鉴于我使用 InnodDB 并且 IGNORE 不起作用,我将如何优雅地删除重复的行?

【问题讨论】:

    标签: mysql unique-constraint


    【解决方案1】:

    您可以暂时将 ENGINE 更改为 MyISAM 以让 MySQL 消除重复项

    ALTER TABLE locales_target ENGINE MyISAM;
    ALTER IGNORE TABLE locales_target ADD PRIMARY KEY (language, lid, plural);
    ALTER TABLE locales_target ENGINE InnoDB;
    

    【讨论】:

    • +1。谢谢。简单的!它就像一个魅力!在我实际发布之前,您在我的编辑中回答了这个问题! :)
    【解决方案2】:
    SELECT language, lid, plural, COUNT(*) AS count
    FROM locales_target
    GROUP BY language, lid, plural
    HAVING count > 1
    

    应该可以解决问题。

    【讨论】:

    • +1 谢谢。与ruakh的回答相同的评论。 :) 再次感谢。
    【解决方案3】:

    同样的事情,除了列出您的三个字段(languagelidplural)而不仅仅是 emailaddress

    SELECT GROUP_CONCAT(id), language, lid, plural, count(*) as count
    FROM locales_target
    GROUP BY language, lid, plural HAVING count >= 2;
    

    (注意:这假设您有一些有意义的 id 字段,您可以选择该字段确实唯一标识行。如果问题是您的表有 no 真正唯一的键,那么这比较棘手,但您可以尝试将所有字段连接在一起并将其放入 id 插槽中。)

    【讨论】:

    • +1 谢谢。我在看到您的答案之前发布了编辑。 “有意义的 id”实际上是盖子。我不知道我们可以按几个字段分组。谢谢。
    猜你喜欢
    • 2019-05-03
    • 2011-05-25
    • 2020-07-22
    • 2012-05-03
    • 1970-01-01
    • 2016-07-27
    • 2020-04-01
    • 2022-01-13
    相关资源
    最近更新 更多