mysql 多字段删除重复数据,保留最小id数据

本文提供两种SQL方法来删除带有特定条件的重复记录。通过选择保留每个重复组中ID最小的记录,实现对route表中payment_type=0且point_start和point_end相同的重复数据的有效清理。

直接上sql:方法一:

delete from Route where id in (select b.id from (select * from Route a where id<>(select min(id) from Route

where payment_type=0 and point_start=a.point_start and point_end=a.point_end)
)b);

问题:一张route表。现在需要删除,payment_type=0 ,并且point_start 和point_end相同的重复数据,示例如下:

id为19,267的数据重复。20,268,269数据重复。需要保留id为19和20的。其他重复数据删除。

方法二:

 

 delete from Route where id in (select b.id from (select * from Route  where (point_start,point_end)in( select point_start,point_end from Route a where payment_type=0 group by point_start,point_end having count(*)>1)
 and id not in (select min(id) from Route t group by t.point_start,t.point_end having count(*)>1))b);

两种方法都能满足需求。至于性能方面。哪个好,没怎么测。欢迎有兴趣的测试一下,然后告诉我。

转载于:https://www.cnblogs.com/clcliangcheng/p/9042710.html

### MySQL删除表内字段值重复数据的方法 #### 使用子查询和 `DELETE` 语句 (适用于少量重复) 对于仅存在一次重复的情况,可以通过自连接的方式找到并删除多余的记录。具体操作如下: ```sql DELETE t1 FROM table_name AS t1 INNER JOIN table_name AS t2 ON t1.duplicate_column = t2.duplicate_column AND t1.id > t2.id; ``` 这条 SQL 语句会保留具有最小 ID 的那一行,并移除其他所有拥有相同 `duplicate_column` 值的行[^1]。 #### 处理大量不确定次数的重复项 当面对未知数量的重复条目时,可以采用临时表的方式来处理这个问题。创建一个新的临时表存储唯一键组合后的结果集,再将其内容重新导入原表中替换旧有的数据结构: ```sql CREATE TEMPORARY TABLE temp_table SELECT MIN(id) as id, duplicate_column FROM table_name GROUP BY duplicate_column; TRUNCATE TABLE table_name ; INSERT INTO table_name (id,duplicate_column) SELECT * FROM temp_table ; DROP TEMPORARY TABLE IF EXISTS temp_table; ``` 这种方法能够有效地清理掉所有的冗余副本,只留下每组重复中最先出现的那一份记录. #### 应用窗口函数(MySQL 8.0 及更高版本) 如果使用的 MySQL 版本支持窗口函数,则可利用此特性简化去除重复的过程。通过分配唯一的编号给每一组内的成员来识别哪些应该被清除: ```sql WITH CTE AS ( SELECT *, ROW_NUMBER() OVER(PARTITION BY duplicate_column ORDER BY id ASC) row_num FROM table_name ) DELETE FROM table_name WHERE id IN( SELECT id FROM CTE WHERE row_num > 1 ); ``` 上述命令会在保持原始顺序的前提下消除除了第一次遇见之外的所有匹配实例. 为了确保安全性和准确性,在执行任何更改之前建议备份整个数据库或至少涉及修改的目标表格。此外,测试环境下的验证也是必不可少的一个环节。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值