MySQL刪除數據表中重復數據


今天遇到一個問題,數據表的數據有重復的,關鍵原因在於新增數據時,沒有根據條件先判斷數據是否存在,當數據存在時進行有關條件的更新,不存在時做新增數據。

對於表中已經存在的數據處理辦法的方法:

1.先根據條件進行統計數據重復率。

2.查詢那一些數據是重復的,將重復數據放在一張表中用於條件對比將源數據中的重復數據刪除(mysql中使用一張表,sqlserver中可以使用臨時表或者表變量存放數據)。

3.根據條件關聯將重復數據刪除。

可以先查詢重復數據的總數:

select sum(count)
from(
select bidsectioncode,count(bidsectioncode) as count from businessdata.business_bidsection
group by bidsectioncode having count>1
order by create_time desc
) as d;

查出數據庫中的重復記錄的數據中的一條,這個不難,很簡單的,sql語句如下:

select * from businessdata.business_bidsection
 where bidsectioncode in (select  bidsectioncode from businessdata.business_bidsection  group  by  bidsectioncode   having  count(bidsectioncode) > 1) 
and id in (select min(id) from  businessdata.business_bidsection  group by bidsectioncode having count(bidsectioncode)>1)

這些都是不重復的,換句話說都是要保留的,不被刪掉的,而其余與這些結果中name相同的應該被刪掉。

也就是說將上邊那個sql語句id后邊加一個not ,查出來的結果就是要刪掉的。

select * from businessdata.business_bidsection
 where bidsectioncode in (select  bidsectioncode from businessdata.business_bidsection  group  by  bidsectioncode   having  count(bidsectioncode) > 1) 
and id not in (select min(id) from  businessdata.business_bidsection  group by bidsectioncode having count(bidsectioncode)>1)

我把這些需要刪掉的存到另外一個表里,然后我新建一個business_bidsection_test表,結構復制business_bidsection的結構就好了。

復制一個創建語句到test表中。

然后將重復數據添加到test表中,插入語句是:

insert into business_bidsection_test
(select * from businessdata.business_bidsection
 where bidsectioncode in (select  bidsectioncode from businessdata.business_bidsection  group  by  bidsectioncode   having  count(bidsectioncode) > 1) 
and id not in (select min(id) from  businessdata.business_bidsection  group by bidsectioncode having count(bidsectioncode)>1));

那接下來做的就是刪掉business_bidsection表里邊與business_bidsection_test表的id相同的數據。

delete a.* from business_bidsection a, business_bidsection_test b where a.id = b.id ;

這樣的結果就是完全不重復的,但是id是不連續的。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM