mysql - 删除 MySQL 中除 One 之外的所有重复行

zhengyun_ustc 阅读:5 2023-05-25 15:08:15 评论:0

如何从 MySQL 表中删除所有重复数据?

例如,使用以下数据:

SELECT * FROM names; 
 
+----+--------+ 
| id | name   | 
+----+--------+ 
| 1  | google | 
| 2  | yahoo  | 
| 3  | msn    | 
| 4  | google | 
| 5  | google | 
| 6  | yahoo  | 
+----+--------+ 

如果是 SELECT 查询,我会使用 SELECT DISTINCT name FROM names;

我将如何使用 DELETE 执行此操作,以仅删除重复项并仅保留每个记录?

请您参考如下方法:

Editor warning: This solution is computationally inefficient and may bring down your connection for a large table.

注意 - 您需要首先在表的测试副本上执行此操作!

我做的时候发现除非我也包括了AND n1.id <> n2.id ,它删除了表格中的每一行。

  1. 如果要保留最低的行id值:

    DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name 
    
  2. 如果要保留最高的行id值(value):

    DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name 
    

我在 MySQL 5.1 中使用了这种方法

不确定其他版本。


更新:由于人们在谷歌上搜索删除重复项最终会出现在这里
虽然 OP 的问题是关于 DELETE , 请注意使用 INSERTDISTINCT快得多。对于一个有 800 万行的数据库,下面的查询用了 13 分钟,而使用 DELETE ,花了2个多小时,还没有完成。

INSERT INTO tempTableName(cellId,attributeId,entityRowId,value) 
    SELECT DISTINCT cellId,attributeId,entityRowId,value 
    FROM tableName; 


标签:程序员
声明

1.本站遵循行业规范,任何转载的稿件都会明确标注作者和来源;2.本站的原创文章,请转载时务必注明文章作者和来源,不尊重原创的行为我们将追究责任;3.作者投稿可能会经我们编辑修改或补充。

全民解析

全民解析

关注我们