我的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不起作用,我将如何优雅地删除重复的行?
答案 0 :(得分:4)
同样的事情,除了列出您的三个字段(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
插槽中。)
答案 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;