首页 > 解决方案 > 删除 MySQL 表中除第一条记录外的所有重复记录

问题描述

我有一个表,其中所有列都有许多重复的行(没有autoincrement ID / primary key列)。我想保留重复的第一条记录并删除所有其他记录。

某些列将具有空值。

我尝试了以下语法:

ALTER IGNORE TABLE `volume_data_required`    
ADD UNIQUE INDEX ('category_desc', 'country_english_desc', 'SKUID', 'mrdr_desc', 'month_id', 'Sum_of_volume_tonnes', 'Sum_of_volume_cases', 'volume_units', 'Sum_of_gross_sales_value', 'Sum_of_turnover', 'Sum_of_gross_profit');

但是,我收到一个错误1064

标签: mysql

解决方案


ALTER IGNORE TABLE 在 MySQL 5.7 中不再可用,因为它会导致复制问题。
https://dev.mysql.com/worklog/task/?id=7395

我建议在表中添加一个数字自动增量 PK 字段,以帮助查找第一行。(主键对性能至关重要,因此也可以长期考虑。)

步骤1:

ALTER TABLE tbl ADD pkCol INT(10) UNSIGNED NOT NULL auto_increment FIRST;

第2步:

编写一个子查询以查找第一个主键,并按使行重复的所有字段进行分组。然后,您可以删除外部查询中连接字段但与第一个 PK 不匹配的所有行。

如果您要加入的列可能为 NULL,则需要用 IFNULL 包装该列,因为您无法在 NULL 字段上进行 JOIN。同样,您不能在 GROUP BY 子句中对 NULL 字段进行分组,并且需要将列包装在 IFNULL 中。

DELETE t1
FROM tbl t1
JOIN (
   SELECT t2.*, MIN(pkCol) first_pkCol
   FROM tbl t2
   GROUP BY IFNULL(col1,0),col2,col3
) t2 ON (IFNULL(t1.col1,0) = IFNULL(t2.col1,0)
         AND t1.col2 = t2.col2 
         AND t1.col3 = t2.col3)
WHERE t1.pkCol <> t2.first_pkCol;

推荐阅读