如何识别和删除或更新Mysql表中的重复行

时间:2018-12-12 22:00:14

标签: mysql sql

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

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

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

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

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

1 个答案:

答案 0 :(得分:1)

检查此查询。我认为这非常简单而且有效:

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;

以上查询未经测试