假如現(xiàn)在 MySQL數(shù)據(jù)庫有幾萬條記錄,由于某些原因?qū)е缕渲写嬖谝恍┲貜?fù)的記錄。那么如何刪除重復(fù)記錄只留其中一條呢?
比如,比如存在十條重復(fù)的記錄,需要?jiǎng)h除其它九條記錄,只保留一條記錄。
數(shù)據(jù)準(zhǔn)備
我們創(chuàng)建如下示例表, Student_Information 表創(chuàng)建 SQL如下 :
我們插入一部分?jǐn)?shù)據(jù)到該表,其中存在多條姓名為 Anaa 的手機(jī)號(hào)碼重復(fù)數(shù)據(jù),如下:
數(shù)據(jù)入庫后,我們通過 select * from Student_Information 查詢結(jié)果如下:
設(shè)計(jì)SQL
我們通過 Group by對(duì)手機(jī)號(hào)進(jìn)行分組,然后計(jì)算每組最大ID作為保留數(shù)據(jù),然后刪除其他數(shù)據(jù)。SQL設(shè)計(jì)如下:
執(zhí)行該SQL,結(jié)果如下:
我們可以看到,該 SQL刪除了重復(fù)的數(shù)據(jù)時(shí),并且保留了id最大的數(shù)據(jù)(最新數(shù)據(jù))。
設(shè)計(jì)該SQL時(shí)需要注意什么?
我們需要注意,使用 MySQL 進(jìn)行 Delete From 操作時(shí),若子查詢的 FROM 子句和刪除或更新對(duì)象使用同一張表時(shí),會(huì)出現(xiàn)"You can't specify target table for update in FROM clause”。錯(cuò)誤。
比如,我們?cè)O(shè)計(jì)如下SQL。該 SQL從語法來看也實(shí)現(xiàn)刪除 Student_Information 表重復(fù)數(shù)據(jù),我們執(zhí)行一下看下結(jié)果。
執(zhí)行結(jié)果如下,我們可以看到拋出了"You can't specify target table for update in FROM clause”錯(cuò)誤,那么該如何解決呢?
解決這個(gè)問題的方法也很簡(jiǎn)單,就是將 select 出的結(jié)果通過中間表再 select 一遍即可,如下:






