Mysql删除表里的重复数据并保留一条唯一的数据

说明:工作中有时会面临需要删除数据表中的重复数。一条sql解决更方便!

子查询是根据唯一性字段分组,SUBSTRING_INDEXGROUP_CONCAT结合使用可以得到需要删除的主键ID,GROUP_CONCAT也可以进行排序,按照自己的需求来保留一条数据。
方案一:

DELETE purchase_order_logistics 
FROM
	purchase_order_logistics
	INNER JOIN (
	SELECT
		SUBSTRING_INDEX(
			GROUP_CONCAT( pol_id ),
			',',
		count( 1 )-1) AS delete_id_str 
	FROM
		purchase_order_logistics 
	GROUP BY
		pol_po_id,
		pol_logistics_num 
	HAVING
		count( 1 )> 1 
	) AS a ON pol_id IN (
	delete_id_str)

方案二:

DELETE 
v2_unify_no
FROM
	v2_unify_no
WHERE
	un_id NOT IN ( select un_id from (SELECT min(un_id) as un_id FROM v2_unify_no
GROUP BY un_ruku_no HAVING count( un_id )> 1) as a ) 
	AND un_ruku_no IN (select un_ruku_no from (SELECT un_ruku_no FROM v2_unify_no
GROUP BY un_ruku_no HAVING count( un_id )> 1) as b)

注意
group_concat()函数有最大长度限制,默认是1024个字符。可以修改mysql的系统变量

show variables like 'group_concat_max_len';

在[mysqld]下新增配置:

group_concat_max_len = 102400;

这个变量的数字是字符长度,默认是1024;大家可以根据实际的使用环境进行调整

欢迎大家交流!!!

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值