我的 CMS 升级有以下查询:
ALTER IGNORE TABLE locales_target ADD PRIMARY KEY (language, lid, plural)
失败的原因是:“键‘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;
但它是针对一个独特的领域这样做的。如何使用 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 不起作用,我将如何优雅地删除重复的行?
最佳答案
同样的事情,除了列出您的三个字段(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;
(注意:这假定您有一些有意义的 id
字段,您可以选择它确实唯一标识行。如果问题是您的表没有真正唯一的键,那就更棘手了,但您可以尝试将所有字段连接在一起并将其放入 id
槽中。)
关于mysql - 查找违反多个字段唯一约束的重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20040181/