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