从MySQL表中删除重复值的最佳方法是什么?

时间:2013-02-11 16:53:06

标签: mysql sql mysqli duplicates

我有以下SQL从表中删除重复值

DELETE p1 
FROM `ProgramsList` p1, `ProgramsList` p2  
WHERE p1.CustId = p2.CustId 
    AND p1.CustId = 1 
    AND p1.`Id`>p2.`Id` 
    AND p1.`ProgramName` = p2.`ProgramName`;

Id是自动增量的 对于给定的CustId ProgramName,必须是唯一的(目前不是)
上述SQL需要大约4到5个小时才能完成,大约有1,000,000条记录

有人可以建议更快捷地从表中删除重复项吗?

2 个答案:

答案 0 :(得分:0)

首先,您可以尝试将索引添加到ProgramName和CustID字段(如果您还没有)。

<强>德都平

您可以将记录分组以识别欺骗,并在执行此操作时,获取每个组的最小ID值。然后,只删除所有ID不是MinID的记录。

输入法

delete from
 ProgramsList
where
 id not in 
    (select min(id) as MinID
      from ProgramsList
      group by ProgramName, CustID) 

<强>加入-方法

如果每个组中有许多成员,则可能必须多次运行此操作。

DELETE P
FROM ProgramsList as P
INNER JOIN 
    (select count(*) as Count, max(id) as MaxID
     from ProgramsList
     group by ProgramName, CustID) as A on A.MaxID = P.id
WHERE A.Count >= 2

有些人在使用In-Clause时遇到性能问题,有些则没有。这很大程度上取决于您的索引等。如果一个太慢,请尝试另一个。

相关:https://stackoverflow.com/a/4192849/127880

答案 1 :(得分:0)

这将一次删除所有重复项。

从内部查询中获取一个ID,该ID不会被删除,其余的将被删除。

delete p from ProgramsList as p
INNER JOIN (select ProgramName as Pname, max(id) as MaxID
     from ProgramsList
     group by ProgramName, CustID order by null) as A on  Pname=P.ProgramName
    where A.MaxID != P.id