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

标签 mysql unique-constraint

我的 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 不起作用,我将如何优雅地删除重复的行?

最佳答案

同样的事情,除了列出您的三个字段(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 槽中。)

关于mysql - 查找违反多个字段唯一约束的重复行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20040181/

相关文章:

php - MySQL 创建一个查找和替换查找表

XML特有的错误语法?

postgresql - 自动递增,但忽略列中的现有值

mysql - mysql无法创建外键

mysql - 有没有办法在 SELECT 语句中存储变量?

mysql - 如果表中没有时间戳,则自动插入时间戳

ruby-on-rails - 如何在 rails 事件记录中创建除 id 以外的唯一列

python - Django:创建一个不是主键唯一的列

php - JSON 解码到 MYSQL 数据库

php - 将旧系统迁移到 ORM,您有什么建议?