如何从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
执行此操作以仅删除重复项并仅保留每条记录的一条记录?
答案 0 :(得分:889)
编辑器警告:此解决方案在计算上效率低下,可能会降低大型表的连接。
注意 - 您需要首先在表格的测试副本上执行此操作!
当我这样做时,我发现除非我也包含AND n1.id <> n2.id
,否则会删除表格中的每一行。
如果您想保留行id
值最低的行:
DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
如果您想保留具有最高id
值的行:
DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name
我在MySQL 5.1中使用了这个方法
不确定其他版本。
更新:由于人们谷歌搜索删除重复项目最终在这里
虽然OP的问题是DELETE
,但请注意,使用INSERT
和DISTINCT
要快得多。对于具有800万行的数据库,以下查询花费了13分钟,而使用DELETE
时,花费了超过2小时但尚未完成。
INSERT INTO tempTableName(cellId,attributeId,entityRowId,value)
SELECT DISTINCT cellId,attributeId,entityRowId,value
FROM tableName;
答案 1 :(得分:181)
如果要保留行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错误。