【问题标题】:What is the best way to delete duplicate values from MySQL Table?从 MySQL 表中删除重复值的最佳方法是什么?
【发布时间】:2020-01-26 04:13:01
【问题描述】:

我有以下 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 条记录

谁能建议一种从表中删除重复项的更快方法?

【问题讨论】:

标签: mysql sql duplicates


【解决方案1】:

首先,如果您还没有索引,您可以尝试向 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

【讨论】:

  • 我使用了Join-Method,我能够在 155.1804 秒内删除 255395 行,感谢 Brian :)
  • 这是一个很大的改进:)
【解决方案2】:

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

从内部查询中得到一个没有被删除的 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-17
    • 2019-09-01
    • 2022-08-12
    • 1970-01-01
    • 1970-01-01
    • 2015-06-05
    相关资源
    最近更新 更多