求助:基于5列删除MariaDB表中重复行(无SQL基础)
删除MariaDB表中重复记录的方案
前提说明
你的表结构及示例数据如下:
| loading_tracking_id | loading_id | loading_num | time | event | name | name_en |
|---|---|---|---|---|---|---|
| 3830640 | 111111 | 105416102020 | 2021-07-01 01:59:00 | office | London | UK |
| 3830641 | 22222 | 402055656444 | 2022-03-02 08:02:13 | courier | Paris | FR |
| 3830642 | 111111 | 105416102020 | 2021-07-01 01:59:00 | office | London | UK |
| 3830643 | 111111 | 105416102020 | 2021-07-01 01:59:00 | office | London | UK |
| 3830644 | 111111 | 105416102020 | 2021-07-01 01:59:00 | office | London | UK |
| 3830645 | 111111 | 105416102020 | 2021-07-01 01:59:00 | office | London | UK |
需求为:删除loading_id、loading_num、time、event、name五列完全重复的记录,仅保留任意一条。服务器版本为10.3.37-MariaDB。
操作步骤(必看)
- 先备份表:执行删除前务必备份数据,避免误删无法恢复。备份命令:
CREATE TABLE your_table_backup AS SELECT * FROM your_table;
(将your_table替换为你的实际表名)
- 选择以下任一方法执行删除:
方法一:使用CTE(推荐,逻辑清晰)
此方法会保留每组重复记录中loading_tracking_id最小的那条,删除其余重复项:
WITH duplicates AS ( SELECT loading_tracking_id, ROW_NUMBER() OVER ( PARTITION BY loading_id, loading_num, time, event, name ORDER BY loading_tracking_id ) AS row_num FROM your_table ) DELETE FROM your_table WHERE loading_tracking_id IN ( SELECT loading_tracking_id FROM duplicates WHERE row_num > 1 );
方法二:使用子查询(兼容更早版本)
如果CTE执行报错,可使用此方法,同样保留loading_tracking_id最小的记录:
DELETE t1 FROM your_table t1 JOIN your_table t2 ON t1.loading_id = t2.loading_id AND t1.loading_num = t2.loading_num AND t1.time = t2.time AND t1.event = t2.event AND t1.name = t2.name AND t1.loading_tracking_id > t2.loading_tracking_id;
注意事项
- 所有代码中的
your_table必须替换为你的实际表名 - 可先执行查询语句验证要删除的记录:
- 方法一对应查询:
SELECT * FROM duplicates WHERE row_num > 1; - 方法二对应查询:
SELECT t1.* FROM your_table t1 JOIN your_table t2 ON t1.loading_id = t2.loading_id AND t1.loading_num = t2.loading_num AND t1.time = t2.time AND t1.event = t2.event AND t1.name = t2.name AND t1.loading_tracking_id > t2.loading_tracking_id;
- 方法一对应查询:
- 删除完成后,可通过
SELECT * FROM your_table;查看结果是否符合预期
内容的提问来源于stack exchange,提问作者Dido
相关产品推荐
相关产品推荐

