是否删除MySQL中除一行之外的所有重复行?
如何从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
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也会删除唯一的行。实际上所有行