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

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

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

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 色戒真做gif动图 | 久久观看视频 | 欧美同志gaypronvideos | 嗯啊好大好爽 | 精品国内自产拍在线视频 | 好吊色视频988gao在线观看 | 免费网站看v片在线成人国产系列 | 欧美又大又粗又爽视频 | 免费超级乱淫视频播放性 | 国产香蕉一区二区在线观看 | 亚洲精品九色在线网站 | 亚洲国产福利精品一区二区 | 7777奇米影视 | 久久99精品涩AV毛片观看 | 五月天精品视频在线观看 | 明星h文集合短篇小说 | 俄罗斯男男激情1069gay | 日本中文字幕在线观看视频 | 91精品综合国产在线观看 | h片免费网站 | 成年人在线观看视频免费 | 91麻豆精品国产 | 欧美国产在线视频 | 亚洲精品第五页中文字幕 | 欧美一区二区三区四区在线观看 | 免费看黄色大片 | 成全视频在线观看免费 | 无码乱人伦一区二区亚洲 | 91动漫在线观看 | 国产精品猎奇系列在线观看 | 男人猛戳女人下部30分钟 | 亚洲色欲色欲综合网站 | 欧美一级xxxx俄罗斯一级 | 青草午夜精品视频在线观看 | 亚洲国产视频网站 | 女教师巨大乳孔中文字幕免费 | 男人天堂亚洲 | 国产亚洲综合精品一区二区三区 | 久热在线这里只有精品7 | 韩国久播影院理论片不卡影院 | 成年性午夜免费视频网站不卡 |