首页 > 解决方案 > 如何识别和删除或更新Mysql表中的重复行

问题描述

由于最近的一个错误,我们有一个包含多个重复条目的表。
我想要做的是找到并理想地删除(或者可能只是更新)重复的行。

PersonGroup
-----------
id
personId
groupId
type
primary
value

select count(*) cnt from personGroup pg where type="FOO" group by personId having cnt > 1;

产生近 20k 行。应该有 0。personId对于任何给定的 ,每个都应该只有一个条目type

我可以编写一个程序来解决这种情况,但在我这样做之前,我想知道是否有一个纯粹的 SQL 解决方案。

标签: mysqlsql

解决方案


检查此查询。我认为它非常简单但有效:

delete from persongroup
 where id not in (
    select max(id)
      from persongroup
     group by PersonId);

如果你的表太大那么你可以考虑用内连接写这个

 delete persongroup
   from persongroup
  inner join (
     select max(id) as lastId, personId
       from personGroup
      group by personId
     having count(*) > 1) dup on dup.personId = persongroup.personId
  where persongroup.id < dup.lastId;

以上查询未经测试


推荐阅读