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

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