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

标签 mysql sql duplicates

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

例如,使用以下数据:

SELECT * FROM names;

+----+--------+
| id | name   |
+----+--------+
| 1  | google |
| 2  | yahoo  |
| 3  | msn    |
| 4  | google |
| 5  | google |
| 6  | yahoo  |
+----+--------+

我会使用SELECT DISTINCT name FROM names;如果它是 SELECT询问。

我该如何使用 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 最高的行值:

    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;

关于mysql - 删除 MySQL 中除重复行之外的所有重复行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55158647/

相关文章:

php - 我有 4 个标题公告。但只出现一个标题公告。如何让所有的标题都显示出来?

sql - SQL:带有可选连接的查询

python - 如何将已删除的 python pandas 列保存为 csv?

mysql - ER_HOST_NOT_PRIVILEGED - docker 容器无法连接到 mariadb

php 查询 - 按日期过滤

mysql - 执行插入/删除批处理 spring-jdbc/mysql 的最佳方法

bash - 在文件中查找包含重复字符的行

css - 悬停时不需要的重复图像

mysql - 查询从多个表中选择 MySQL

sql - 将两个不同表中的 2 个值插入到一个表中