是否删除MySQL中除一行之外的所有重复行?

是否删除MySQL中除一行之外的所有重复行?,mysql,sql,duplicates,Mysql,Sql,Duplicates,如何从MySQL表中删除所有重复数据 例如,使用以下数据: SELECT * FROM names; +----+--------+ | id | name | +----+--------+ | 1 | google | | 2 | yahoo | | 3 | msn | | 4 | google | | 5 | google | | 6 | yahoo | +----+--------+ 我将使用从名称中选择不同的名称如果是查询,则选择查询 我如何使用DELET

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

例如,使用以下数据:

SELECT * FROM names;

+----+--------+
| id | name   |
+----+--------+
| 1  | google |
| 2  | yahoo  |
| 3  | msn    |
| 4  | google |
| 5  | google |
| 6  | yahoo  |
+----+--------+
我将使用
从名称中选择不同的名称如果是
查询,则选择
查询


我如何使用
DELETE
来删除重复项并只保留一条记录?

如果要保留具有最低
id
值的行:

DELETE FROM NAMES
 WHERE id NOT IN (SELECT * 
                    FROM (SELECT MIN(n.id)
                            FROM NAMES n
                        GROUP BY n.name) x)
如果您想要最高的
id
值:

DELETE FROM NAMES
 WHERE id NOT IN (SELECT * 
                    FROM (SELECT MAX(n.id)
                            FROM NAMES n
                        GROUP BY n.name) x)
子查询中的子查询对于MySQL是必需的,否则会出现1093错误

编辑器警告:此解决方案计算效率低下,可能会导致大表连接中断。

NB-您需要先在表的测试副本上执行此操作

当我这样做时,我发现除非我也包括
和n1.id n2.id
,否则它会删除表中的每一行。


  • 如果要保留具有最低
    id
    值的行:

    从名称n1、名称n2中删除n1,其中n1.id>n2.id和n1.name=n2.name
    

  • 如果要保留具有最高
    id
    值的行:

    DELETE FROM NAMES
     WHERE id NOT IN (SELECT * 
                        FROM (SELECT MIN(n.id)
                                FROM NAMES n
                            GROUP BY n.name) x)
    
    从名称n1、名称n2中删除n1,其中n1.id
  • 我在MySQL 5.1中使用了这种方法

    不确定其他版本


    更新:因为人们在谷歌上搜索删除重复项的结果就出现在这里
    虽然OP的问题是关于
    删除
    ,但请注意使用
    插入
    区分
    要快得多。对于一个有800万行的数据库,下面的查询耗时13分钟,而使用
    DELETE
    ,则耗时2个多小时,但仍未完成

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

    复制和(讽刺的是)这不是一个完全重复的问题,因为这特别要求DELETE命令执行与ALTER命令添加唯一索引相同的操作,以使MySQL自动删除重复的行。在本例中,我们选择要删除重复项的确切方式。因此,关于重复项的问题有重复项吗?HMMEExcellent解决方案。它工作得很好。但我有一个建议,我们应该交换条件。我们不应该写[WHERE n1.id>n2.id和n1.name=n2.name],而应该写[WHERE n1.name=n2.name和n1.id>n2.id],如果我们有这么多数据,它会提高性能。仅供参考:这忽略了列“name”为空的行。这个答案中的NB非常重要。但这是MySQL的一个极好的例子。请注意,对于可能重复多次的表,您还需要一个
    GROUP BY
    n1.id子句。我喜欢此解决方案,但您是否有建议在较大的表上对其进行优化?对于包含450个重复项的10000条记录表,这需要171秒。OMG Ponies用了4秒钟的时间给出了答案。“x”是做什么的?@GDmac它作为内部查询的别名。如果未指定,将抛出错误。@wbinky它用作内部查询的别名。如果未指定,将抛出一个错误。但是x代表什么?(只是开玩笑)看来这个sql也会删除唯一的行。实际上所有行