在多个字段上查找违反唯一约束的重复行

aug*_*tin 0 mysql unique-constraint

我的 CMS 升级有以下查询:

ALTER IGNORE TABLE locales_target ADD PRIMARY KEY (language, lid, plural)
Run Code Online (Sandbox Code Playgroud)

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

我实际上在上面的查询中添加了 IGNORE ,但它没有帮助,因为表使用 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;
Run Code Online (Sandbox Code Playgroud)

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

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

1) '1-0' 在错误信息中代表什么?没有盖子 == 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.
Run Code Online (Sandbox Code Playgroud)

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

rua*_*akh 5

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

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

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