
文章插圖
刪除全部重復數(shù)據(jù),一條不留刪除表中刪除重復數(shù)據(jù),僅保留一條開始刪除重復數(shù)據(jù),僅留一條在公司加班到八點,此為背景 。
加班原因是上線,解決線上數(shù)據(jù)庫存在重復數(shù)據(jù)的問題,發(fā)現(xiàn)了程序的bug,很好解決,有點問題的是,修正線上的重復數(shù)據(jù) 。
線上庫有6個表存在重復數(shù)據(jù),其中2個表比較大,一個96萬+、一個30萬+,因為之前處理過相同的問題,就直接拿來了上次的Python去重腳本,腳本很簡單,就是連接數(shù)據(jù)庫,查出來重復數(shù)據(jù),循環(huán)刪除 。
emmmm,但是這個效率嘛,實在是太低了,1秒一條,重復數(shù)據(jù)大約2萬+,預估時間大約在8個小時左右 。。。
盲目依靠前人的東西,而不去自己思考是有問題的!總去想之前怎么可以,現(xiàn)在怎么不行了,這也是有問題的!我發(fā)現(xiàn),最近確實狀態(tài)不太對,失去了探索和求知的欲望,今天算是一個警醒,頗有迷途知返的感覺 。
言歸正傳,下面詳細介紹去重步驟 。
CREATETABLE`animal`(`id`int(11)NOTNULLAUTO_INCREMENT,`name`varchar(20)DEFAULTNULL,`age`int(11)DEFAULTNULL,PRIMARYKEY(`id`))ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8COLLATE=utf8_bin;INSERTINTO`pilipa_dds`.`student`(`id`,`name`,`age`)VALUES('1','cat','12');INSERTINTO`pilipa_dds`.`student`(`id`,`name`,`age`)VALUES('2','dog','13');INSERTINTO`pilipa_dds`.`student`(`id`,`name`,`age`)VALUES('3','camel','25');INSERTINTO`pilipa_dds`.`student`(`id`,`name`,`age`)VALUES('4','cat','32');INSERTINTO`pilipa_dds`.`student`(`id`,`name`,`age`)VALUES('5','dog','42');目標:我們要去掉name相同的數(shù)據(jù) 。
先看看哪些數(shù)據(jù)重復了
SELECTname,count(1)FROMstudentGROUPBYNAMEHAVINGcount(1)>1;輸出:
name count(1) cat 2 dog 2
name為cat和dog的數(shù)據(jù)重復了,每個重復的數(shù)據(jù)有兩條;
Select*From表Where重復字段In(Select重復字段From表GroupBy重復字段HavingCount(1)>1)刪除全部重復數(shù)據(jù),一條不留直接刪除會報錯
DELETEFROMstudentWHERENAMEIN(SELECTNAMEFROMstudentGROUPBYNAMEHAVINGcount(1)>1)報錯:
1093 – You can’t specify target table ‘student’ for update in FROM clause, Time: 0.016000s
原因是:更新這個表的同時又查詢了這個表,查詢這個表的同時又去更新了這個表,可以理解為死鎖 。mysql不支持這種更新查詢同一張表的操作
解決辦法:把要更新的幾列數(shù)據(jù)查詢出來作為一個第三方表,然后篩選更新 。
DELETEFROMstudentWHERENAMEIN(SELECTt.NAMEFROM(SELECTNAMEFROMstudentGROUPBYNAMEHAVINGcount(1)>1)t)刪除表中刪除重復數(shù)據(jù),僅保留一條在刪除之前,我們可以先查一下,我們要刪除的重復數(shù)據(jù)是啥樣的
SELECT*FROMstudentWHEREidNOTIN(SELECTt.idFROM(SELECTMIN(id)ASidFROMstudentGROUPBY`name`)t)啥意思呢,就是先通過name分組,查出id最小的數(shù)據(jù),這些數(shù)據(jù)就是我們要留下的火種,那么再查詢出id不在這里面的,就是我們要刪除的重復數(shù)據(jù) 。
開始刪除重復數(shù)據(jù),僅留一條很簡單,剛才的select換成delete即可
DELETEFROMstudentWHEREidNOTIN(SELECTt.idFROM(SELECTMIN(id)ASidFROMstudentGROUPBY`name`)t)90萬+的表執(zhí)行起來超級快 。
All done ~
– END –
以上關于本文的內容,僅作參考!溫馨提示:如遇健康、疾病相關的問題,請您及時就醫(yī)或請專業(yè)人士給予相關指導!
「愛刨根生活網(wǎng)」www.malaban59.cn小編還為您精選了以下內容,希望對您有所幫助:- 數(shù)據(jù)透視圖excel教程 excel環(huán)比公式怎么算
- 五種美食 輕松塑造性感肌肉
- 浴佛節(jié)十五種功德 浴佛節(jié)十五種功德有哪些
- 《長津湖》成中國影史票房第三 具體數(shù)據(jù)詳情披露??!
- 常見的數(shù)據(jù)分析工具 數(shù)據(jù)分析書籍有哪些
- 數(shù)據(jù)庫還原操作方法 sql備份數(shù)據(jù)庫
- 用界面方式創(chuàng)建數(shù)據(jù)庫 建立數(shù)據(jù)庫的步驟
- oracle數(shù)據(jù)庫建表的完整步驟 plsqldeveloper使用教程
- 盤點世界上比較常見的五種裸體運動
- 常見的數(shù)據(jù)庫管理系統(tǒng) android 數(shù)據(jù)庫操作
