前言
这是一次mysql移除重复记录
实战,想起来之前并没有share过,所以整理一下发上来大家参考。
假设有company
表:
company_name+price
为判断重复条件,也就是group by
并having count(*)>1
的条件- 需要
保留最大
company_id(也就是移除最小
company_id的记录) - 有些记录不止重复了一两条,可能上百条,多次执行移除重复记录,最后手工筛查过多重复的
实战记录
纯SQL,供参考。
1.软删除
,使用duplicate_flag标记重复。
#############################
# Remove Duplicate
# by zhengkai.blog.csdn.net
#############################
#check duplicate record , with count
select max(u.unit_id),max(u.update_time),u.url,count(*),max(tender_name) from unit u
where u.duplicate_flag=0
group by u.tender_name
having count(*)>1;
###start
insert into unit_delete (
select max(u.unit_id),max(u.update_time),u.url,count(*),max(tender_name) from unit u
where u.duplicate_flag=0
group by u.tender_name
having count(*)>1
);
#remove duplicate by table
update unit as u join unit_delete as ud on u.unit_id = ud.unit_id
set u.duplicate_flag=1 where u.duplicate_flag=0
;
select count(*) from unit u where u.duplicate_flag=1;
###end
- 旧版,硬删除,直接delete
########################################
# MYSQL之移除重复记录
# by zhengkai.blog.csdn.net
########################################
#查询重复数据
select max(u.company_name),max(u.price) from company u
GROUP BY u.company_name,u.price
HAVING count(*)>1;
#测试delete条件(使用不存在的值)
DELETE FROM company where `status`=5;
#开始移除重复
DELETE FROM company
WHERE company_id IN (
SELECT
dt.company_id
FROM
(
SELECT
MIN(x.company_id) AS company_id
FROM
company x
GROUP BY
x.company_name,x.price
having count(*)>1
) dt
);
#一直移除不掉的重复记录手工排除
#(如果一直移除重复执行不尽,可能不止重复了一次,几次几十次上百次都有可能,建议手工看下)
select * from company u where u.company_name='xxx';