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

时间:2013-11-18 04:37:44

标签: mysql unique-constraint

我的CMS升级包含以下查询:

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

失败的原因是:“重复输入'1-0'用于关键'PRIMARY'”。

我实际上已经在上面的查询中添加了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”代表什么?盖子== 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不起作用,我将如何优雅地删除重复的行?

3 个答案:

答案 0 :(得分:4)

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

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

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

答案 1 :(得分:1)

SELECT language, lid, plural, COUNT(*) AS count
FROM locales_target
GROUP BY language, lid, plural
HAVING count > 1

应该这样做。

答案 2 :(得分: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;