如何从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只删除重复,并保持每个记录只有一个?

推荐答案

Editor warning: This solution is computationally inefficient and may bring down your connection for a large table.

NB - You need to do this first on a test copy of your table!

When I did it, I found that unless I also included 100, it deleted every row in the table.

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

    DELETE n1 FROM names n1, names n2 WHERE n1.id > n2.id AND n1.name = n2.name
    
  2. 如果要保留最大值为id的行:

    DELETE n1 FROM names n1, names n2 WHERE n1.id < n2.id AND n1.name = n2.name
    

我在MySQL 5.1中使用了这种方法

不确定其他版本.


Update: Since people Googling for removing duplicates end up here

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

Mysql相关问答推荐

SQL条件 Select 和条件WHERE

无法从容器从APS. NET应用程序连接到MySQL服务器容器

SQL:CAST与窗口函数组合导致语法错误

MySQL::JSON列的添加使SELECT查询非性能(当需要临时表时)

MySQL多次联接同一个表使计数变得奇怪

Ballerina SQL 中是否也应该考虑输入清理?

SQL:如何 Select 每个客户最后购买的产品?

MySQL 8.0.33 Select json列时出现错误:排序内存不足,请考虑增加服务器排序缓冲区大小

MySQL 关于 JSON 数组和子查询的问题

使用mysql查询获取不关注user1的user3

仅当 SELECT 语句在 MySQL 中给出空集时才执行 UPDATE 语句

MySQL 在第一个匹配行后停止搜索 N 行(不是 LIMIT)

如何使用减号运算符编写 sql 查询以返回缺少相应值的行?

如何在更新语句中使用多个子字符串函数?

通过 Gorm 查询模型

Select 在同一天售出不同活动门票的收银员

终止空闲的mysql连接

Laravel $q->where() 日期之间

当您无法修复表时,如何修复 MySQL不正确的密钥文件错误?

MySQL:切换 int 字段值的简单方法