mysql删除历史重复数据(保留最新的一条),并为字段加唯一键

偶尔遇到一张表里重复插入了了相同的数据,为了防止重复的数据,我们需要对历史数据进行清理(保留最新的一条),并且为字段加入唯一键。
下面以pt_logistics_check(包裹验收表)为例,packageNo为包裹号,checkId为验收id(主键),一个包裹在验收时会向pt_logistics_check插入一条记录,故packageNo应该是唯一的。


第一步:在删除历史数据前可先做一些数据的验证

1.重复数据数量21

select checkId from pt_logistics_check   where packageno in (SELECT packageno FROM pt_logistics_check   group by packageno having count(packageNo)>1);

2.重复的组8

SELECT packageno FROM pt_logistics_check group by packageno having count(packageNo)>1

3.需删除的多余数据13(保留最新的一条)

select checkId from pt_logistics_check where checkId  in (
    select checkId from (
        SELECT packageno FROM pt_logistics_check group by packageno having count(packageNo)>1) t 
     where t.packageno=pt_logistics_check.packageno
) and checkId  not in (SELECT max(checkId) as id FROM pt_logistics_check group by packageno having count(packageNo)>1)

21-8=13,数据验证成功,证明sql正确


第二步:删除重复数据(保留最新一条)

              下面为删除多余数据的sql(mysql删除数据时需要多加一层)

delete from pt_logistics_check  where checkId  in (
    select a.checkId from (select checkId from pt_logistics_check where checkId  in (
         select checkId from (
              SELECT packageno FROM pt_logistics_check group by packageno having count(packageNo)>1) t 
         where t.packageno=pt_logistics_check.packageno
    ) and checkId  not in (SELECT max(checkId) as id FROM pt_logistics_check group by packageno having count(packageNo)>1)
    )a
);


第三步:设置唯一键packageno

ALTER TABLE pt_logistics_check ADD unique(packageno);

在删除数据时只要对pt_logistics_check(表名),packageNo(需要加唯一键的字段),checkId(表的主键)进行替换即可



猜你喜欢

转载自blog.csdn.net/qq_39172525/article/details/80825970