mysql - 删除 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
。
解决方案
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;
推荐阅读
- handlebars.js - 如何在 Block Helper 的上下文之外修改车把模板?
- reactjs - 我无法在地图方法中分配元素字段
- react-native - RN Firebase 安卓无震动,IOS无声音+震动
- node.js - 使用 AWS Lambda 获取“MongoServerSelectionError:服务器选择在 30000 毫秒后超时”
- xamarin - 使用 XAMARIN 打开 GPS
- php - “目标类 [Modules\\Admins\\Controllers\\AdminController] 不存在。”
- ios - InAppSettingsKit 完成按钮未显示在视图控制器上
- angular - 如何根据布尔条件渲染项目(在 Angular v10 中)
- powerbi - 我正在尝试获取最后一个分隔符 / dax only 解决方案之后的字符
- extension-function - 无法理解 Kotlin Android 中的扩展功能?