一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

服務器之家:專注于服務器技術及軟件下載分享
分類導航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數據庫技術|

服務器之家 - 數據庫 - Mysql - 關于MySQL 大批量插入時如何過濾掉重復數據

關于MySQL 大批量插入時如何過濾掉重復數據

2021-11-12 18:10 Mysql

這篇文章主要介紹關于MySQL 大批量插入時如何過濾重復數據,比如線上庫有6個表存在重復數據,其中2個表比較大,96萬+和30萬+,因為之前處理過相同的問題,就直接拿來了上次的Python去重腳本,腳本很簡單,就是連接數據庫,查出

前言:

加班原因是上線,解決線上數據庫存在重復數據的問題,發現了程序的bug,很好解決,有點問題的是,修正線上的重復數據。

線上庫有6個表存在重復數據,其中2個表比較大,一個96萬+、一個30萬+,因為之前處理過相同的問題,就直接拿來了上次的Python去重腳本,腳本很簡單,就是連接數據庫,查出來重復數據,循環刪除。

emmmm,但是這個效率嘛,實在是太低了,1秒一條,重復數據大約2萬+,預估時間大約在8個小時左右。。。

盲目依靠前人的東西,而不去自己思考是有問題的!總去想之前怎么可以,現在怎么不行了,這也是有問題的!我發現,最近確實狀態不太對,失去了探索和求知的欲望,今天算是一個警醒,頗有迷途知返的感覺。

言歸正傳,下面詳細介紹去重步驟。

一、發現問題

?
1
2
3
4
5
6
7
8
9
10
11
CREATE TABLE `animal` ( 
  `id` int(11) NOT NULL AUTO_INCREMENT, 
  `name` varchar(20) DEFAULT NULL
  `age` int(11) DEFAULT NULL
  PRIMARY KEY (`id`) 
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COLLATE=utf8_bin; 
INSERT INTO `pilipa_dds`.`student` (`id`, `name`, `age`) VALUES ('1', 'cat', '12'); 
INSERT INTO `pilipa_dds`.`student` (`id`, `name`, `age`) VALUES ('2', 'dog', '13'); 
INSERT INTO `pilipa_dds`.`student` (`id`, `name`, `age`) VALUES ('3', 'camel', '25'); 
INSERT INTO `pilipa_dds`.`student` (`id`, `name`, `age`) VALUES ('4', 'cat', '32'); 
INSERT INTO `pilipa_dds`.`student` (`id`, `name`, `age`) VALUES ('5', 'dog', '42');

目標:我們要去掉name相同的數據。

先看看哪些數據重復了

?
1
2
3
4
5
6
7
SELECT name,count( 1 )  
FROM
 student  
GROUP BY
NAME  
HAVING
 count( 1 ) > 1;

輸出:

name count(1) cat 2 dog 2

namecatdog的數據重復了,每個重復的數據有兩條;

?
1
Select * From Where 重復字段 In (Select 重復字段 From Group By 重復字段 Having Count(1)>1)

二、刪除全部重復數據,一條不留

直接刪除會報錯

?
1
2
3
4
5
6
7
8
9
10
11
12
DELETE  
FROM
 student  
WHERE
 NAME IN
 SELECT NAME  
 FROM
  student  
 GROUP BY
 NAME  
HAVING
 count( 1 ) > 1)

報錯:

?
1
1093 - You can't specify target table 'student' for update in FROM clause, Time: 0.016000s

原因是:更新這個表的同時又查詢了這個表,查詢這個表的同時又去更新了這個表,可以理解為死鎖。mysql不支持這種更新查詢同一張表的操作

解決辦法:把要更新的幾列數據查詢出來做為一個第三方表,然后篩選更新。

?
1
2
3
4
5
6
7
8
9
DELETE  
FROM
 student  
WHERE
 NAME IN
 SELECT
  t.NAME  
FROM
 ( SELECT NAME FROM student GROUP BY NAME HAVING count( 1 ) > 1 ) t)

三、刪除表中刪除重復數據,僅保留一條

在刪除之前,我們可以先查一下,我們要刪除的重復數據是啥樣的

?
1
2
3
4
5
6
7
8
9
10
11
SELECT
 *  
FROM
 student  
WHERE
 id NOT IN
 SELECT
  t.id  
 FROM
 ( SELECT MIN( id ) AS id FROM student GROUP BY `name` ) t  
 )

啥意思呢,就是先通過name分組,查出id最小的數據,這些數據就是我們要留下的火種,那么再查詢出id不在這里面的,就是我們要刪除的重復數據。

四、開始刪除重復數據,僅留一條

很簡單,剛才的select換成delete即可

?
1
2
3
4
5
6
7
8
9
10
DELETE  
FROM
 student  
WHERE
 id NOT IN
 SELECT
  t.id  
 FROM
 ( SELECT MIN( id ) AS id FROM student GROUP BY `name` ) t  
 )

90萬+的表執行起來超級快。

到此這篇關于關于MySQL 大批量插入時如何過濾掉重復數據的文章就介紹到這了,更多相關MySQL過濾掉重復數據內容請搜索服務器之家以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持服務器之家!

原文鏈接:https://database.51cto.com/art/202109/682190.htm

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 爽好大快深点一视频 | 国产一区二区免费福利片 | 国产第7页| 色中文 | 欧美日韩国产在线人成 | 四虎在线最新永久免费 | 国产视频在线一区 | 青草青草伊人精品视频 | 国产成人精品福利色多多 | 欧美视频精品一区二区三区 | 草草在线视频 | 香蕉视频久久 | 久久re热在线视频精69 | 激情综合| 欧美亚洲国产综合在线 | 亚洲天堂免费 | 欧洲另类一二三四区 | 欧美日韩在线一区二区三区 | 国产成人亚洲精品乱码在线观看 | 国产精品欧美亚洲韩国日本 | 成人高清视频在线观看 | 扒开腚眼子视频大全 | 2018亚洲男人天堂 | 视频亚洲一区 | 成人免费视频一区二区三区 | pornohd老师18 | 亚洲视频第一页 | 亚洲国产精品自在自线观看 | 风间由美在线播放 | 国产麻豆91网在线看 | 乳色吐息讲的是什么 | 村妇超级乱淫伦小说全集 | 国产精品区牛牛影院 | 国产精品久久香蕉免费播放 | 亚洲色图影院 | 国内久久久 | 亚洲精品午夜在线观看 | 福利片中文 | 青草香蕉精品视频在线观看 | 精品午夜中文字幕熟女人妻在线 | 久久精品一区二区三区资源网 |