首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否删除MySQL中除一行以外的所有重复行?

问是否删除MySQL中除一行以外的所有重复行?
EN

Stack Overflow用户
提问于 2011-01-14 04:58:38
回答 2查看 500.3K关注 0票数 461

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

例如,使用以下数据:

代码语言:javascript
复制
SELECT * FROM names;

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

如果是SELECT查询,我会使用SELECT DISTINCT name FROM names;。

我该如何使用DELETE来仅删除重复项并保留每个重复项的一条记录?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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小时,但仍未完成。

代码语言:javascript
复制
INSERT INTO tempTableName(cellId,attributeId,entityRowId,value)
    SELECT DISTINCT cellId,attributeId,entityRowId,value
    FROM tableName;
票数 998
EN

Stack Overflow用户

发布于 2011-01-14 05:03:49

如果要保留id值最小的行:

代码语言:javascript
复制
DELETE FROM NAMES
 WHERE id NOT IN (SELECT * 
                    FROM (SELECT MIN(n.id)
                            FROM NAMES n
                        GROUP BY n.name) x)

如果您想要最高的id值:

代码语言:javascript
复制
DELETE FROM NAMES
 WHERE id NOT IN (SELECT * 
                    FROM (SELECT MAX(n.id)
                            FROM NAMES n
                        GROUP BY n.name) x)

子查询中的子查询对于MySQL是必需的,否则将得到1093错误。

票数 227
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4685173

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档