MySQL如何刪除mysql數(shù)據(jù)表內(nèi)的重復(fù)數(shù)據(jù)
刪除數(shù)據(jù)表內(nèi)重復(fù)數(shù)據(jù)的常規(guī)順序是:創(chuàng)建備份、確定重復(fù)記錄、編寫刪除語(yǔ)句
方法一: 借助 inner join
DELETE t1 FROM table t1 INNER JOIN table t2 WHERE t1.id < t2.id AND t1.column1 = t2.column1;
table
是表名,id
是表的唯一標(biāo)識(shí)符,column1
是想要根據(jù)其刪除重復(fù)記錄的列。這條SQL語(yǔ)句會(huì)刪除column1
列中具有相同值的所有記錄,除了id
最大的那一條記錄。- 工作方式是,它會(huì)為表中的每個(gè)重復(fù)的
column1
值找到id
值最小的記錄,并將其刪除。這樣,只有id
值最大的記錄會(huì)被保留下來(lái)。
注:在執(zhí)行操作之前,務(wù)必備份數(shù)據(jù),以防萬(wàn)一。
方法二: 借助 group by
DELETE FROM your_table WHERE id NOT IN ( SELECT MAX(id) FROM your_table GROUP BY column1, column2, ... /* 列出用于判斷重復(fù)的列 */ );
- 這條語(yǔ)句會(huì)保留每組重復(fù)記錄中的最大的
id
,并刪除其他重復(fù)記錄。column1
,column2
為用來(lái)判斷重復(fù)的列名。
注:在執(zhí)行操作之前,務(wù)必備份數(shù)據(jù),以防萬(wàn)一。
方法三:借助 臨時(shí)表
如果數(shù)據(jù)量很大,刪除重復(fù)數(shù)據(jù)可以采用創(chuàng)建臨時(shí)表的方式,效率更高。
步驟:
1.創(chuàng)建一個(gè)新的臨時(shí)表,并將去重后的數(shù)據(jù)插入到新表中。
CREATE TABLE new_table AS SELECT * FROM old_table GROUP BY column_to_be_deduplicated;
在這里,new_table
是新創(chuàng)建的臨時(shí)表的名字,old_table
是原來(lái)的表名,column_to_be_deduplicated
是需要去重的列名。
2.刪除原來(lái)的表/修改原來(lái)的表名
DROP TABLE old_table;
RENAME TABLE old_table TO old_table_bak;
將新的臨時(shí)表重命名為原來(lái)的表名。
RENAME TABLE new_table TO old_table;
這種方式是先將去重后的數(shù)據(jù)插入到一個(gè)新的臨時(shí)表,然后刪除舊的表/修改舊表的名字,最后將臨時(shí)表重命名為舊表的名字,好處是在處理大量數(shù)據(jù)時(shí),效率會(huì)更高。
在第二步的時(shí)候不建議采用直接刪除舊表的方式,凡是涉及到數(shù)據(jù)變動(dòng)的,均需萬(wàn)分謹(jǐn)慎。
總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章

MySQL觸發(fā)器學(xué)習(xí)總結(jié)

MySQL循環(huán)查詢的實(shí)現(xiàn)示例

MySQL 的啟動(dòng)選項(xiàng)和系統(tǒng)變量實(shí)例詳解

減少mysql主從數(shù)據(jù)同步延遲問(wèn)題的詳解

mysql服務(wù)1067錯(cuò)誤多種解決方案分享

mysql調(diào)優(yōu)的幾種方式小結(jié)

深入sql數(shù)據(jù)連接時(shí)的一些問(wèn)題分析