如何从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来仅删除重复项并保留每个重复项的一条记录?
发布于 2011-02-16 20:30:29
编辑器警告:此解决方案的计算效率很低,并且可能会中断大型表的连接。
NB - You 需要首先在表的测试拷贝上执行此操作!
当我这样做的时候,我发现除非我还包括了AND n1.id <> n2.id**,,否则它会删除表中的每一行。**
如果要保留id值最小的行,请从名称中删除: n1 n1,names n2 WHERE n1.id > n2.id n1.name =n2.name如果要保留id值最高的行,请执行以下操作:
从names n1,names n2中删除名称,其中n1.id < n2.id和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;发布于 2011-01-14 05:03:49
如果要保留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错误。
https://stackoverflow.com/questions/4685173
复制相似问题