MySQL中刪除重復(fù)數(shù)據(jù)SQL的三種寫(xiě)法
要在 MySQL 中刪除重復(fù)的數(shù)據(jù)并只保留一條,可以使用下面的方法(要用的時(shí)候直接復(fù)制小改下條件和表名稱(chēng)即即可)
方法一:使用 left join + 子查詢(xún)刪除重復(fù)數(shù)據(jù)(推薦)
溫馨提示:本人在 500w 數(shù)據(jù)下執(zhí)行此 SQL 耗費(fèi) 15s-30s 左右
使用 left join (推薦方法刪除重復(fù)數(shù)據(jù),添加唯一組合索引,可以使用,數(shù)據(jù)量大的也可以)
// 先把歷史數(shù)據(jù)刪除,才能夠添加唯一的組合索引 DELETE u1 FROM uf_cs_record_batch_detail u1 LEFT JOIN ( SELECT MIN(id) AS min_id FROM uf_cs_record_batch_detail GROUP BY cs_contact_name, cs_safe_remark ) u2 ON u1.id = u2.min_id WHERE u2.min_id IS NULL;
另外在附上添加唯一組合索引的 SQL 寫(xiě)法(很實(shí)用):
// 添加組合的唯一索引 ALTER TABLE uf_cs_record_batch_detail ADD UNIQUE KEY idx_uni_contact_safe_stat (cs_contact_name, cs_safe_remark);
方法二:創(chuàng)建臨時(shí)表(需分多步執(zhí)行,邏輯清晰,但會(huì)改變ID值)
這種方法假設(shè)你有一個(gè)表 your_table
,并且你要基于某些列來(lái)判斷哪些數(shù)據(jù)是重復(fù)的。
例如,如果你想刪除基于 column1
和 column2
的重復(fù)記錄,只保留一條記錄,你可以按照以下步驟操作:
- 使用
CREATE TABLE
語(yǔ)句創(chuàng)建一個(gè)臨時(shí)表,用于存儲(chǔ)唯一的記錄。 - 使用
INSERT INTO ... SELECT
語(yǔ)句將唯一的記錄插入到臨時(shí)表中。 - 刪除原始表中的所有記錄。
- 使用
INSERT INTO ... SELECT
語(yǔ)句將臨時(shí)表中的記錄插入回原始表。 - 刪除臨時(shí)表。
以下是一個(gè)完整的 SQL 例子:
-- 創(chuàng)建臨時(shí)表 SQL 參考 CREATETABLE temp_table AS SELECT*FROM your_table -- 將不重復(fù)的數(shù)據(jù)臨時(shí)存在這個(gè) temp_table 臨時(shí)表中 INSERTINTO temp_table SELECT*FROM your_table t1 WHERE t1.id = ( SELECTMIN(t2.id) FROM your_table t2 WHERE t1.column1 = t2.column1 AND t1.column2 = t2.column2 ); -- 然后將源表中的數(shù)據(jù)刪除 DELETEFROM your_table whereWHERE 字段1=值; -- 再將臨時(shí)表中不重復(fù)數(shù)據(jù)重新寫(xiě)回到源表中 INSERTINTO your_table SELECT*FROM temp_table; -- 最后刪除臨時(shí)表 DROPTABLE temp_table;
這樣,你就成功地刪除了原始表中的重復(fù)記錄,只保留了一條唯一記錄。
注意:但是這種方法會(huì)改變?cè)瓉?lái)的數(shù)據(jù) ID ,所以這種方法看場(chǎng)合使用
方法三:使用 JOIN 自連查詢(xún)(需要注意性能問(wèn)題)
為了避免改變?cè)瓉?lái)的數(shù)據(jù) ID,我們可以使用一個(gè)不同的方法,通過(guò)使用自連接來(lái)標(biāo)記重復(fù)的數(shù)據(jù)并刪除多余的記錄。這種方法在保留原始 ID 的情況下刪除重復(fù)記錄。
假設(shè)你的表結(jié)構(gòu)如下:
- 表名:
your_table
- 列名:
id
(主鍵),column1
,column2
, 以及其他列。
你可以使用以下 SQL 來(lái)刪除重復(fù)記錄,只保留一條(通常是保留 ID 最小的那一條):
-- Step 1: 標(biāo)記要?jiǎng)h除的重復(fù)記錄 DELETE t1 FROM your_table t1 INNER JOIN your_table t2 WHERE t1.id > t2.id AND t1.column1 = t2.column1 AND t1.column2 = t2.column2; -- Step 2: 確認(rèn)刪除成功,查看剩余數(shù)據(jù) SELECT * FROM your_table;
解釋?zhuān)?/strong>
-標(biāo)記要?jiǎng)h除的重復(fù)記錄:我們使用自連接 INNER JOIN 來(lái)找到重復(fù)的記錄,并且使用 WHERE t1.id > t2.id 來(lái)確保只刪除 id 較大的記錄,從而保 留 id 最小的記錄。
- 確認(rèn)刪除成功:通過(guò) SELECT 語(yǔ)句查看剩余的數(shù)據(jù),確保刪除操作正確。這個(gè)方法的優(yōu)點(diǎn)是:不會(huì)改變?cè)紨?shù)據(jù)的 ID。保留每組重復(fù)記錄中 ID 最小的一條記錄。操作簡(jiǎn)單且高效。
小總結(jié)
- 使用
left join
刪除重復(fù)數(shù)據(jù)(推薦使用),適合大數(shù)據(jù)量,性能 OK - 創(chuàng)建臨時(shí)表 適合需要重建數(shù)據(jù)表的場(chǎng)景,適合數(shù)據(jù)量中等的情況,不過(guò)比較繁瑣
- 自連查詢(xún) 能保留最小 ID,適合不想改變 ID 的情況下刪除重復(fù)數(shù)據(jù)。
到此這篇關(guān)于MySQL中刪除重復(fù)數(shù)據(jù)SQL的三種寫(xiě)法的文章就介紹到這了,更多相關(guān)MySQL刪除重復(fù)數(shù)據(jù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mysql創(chuàng)建學(xué)生表、課程表及學(xué)生選課表詳細(xì)代碼
這篇文章主要給大家介紹了mysql創(chuàng)建學(xué)生表、課程表及學(xué)生選課表的相關(guān)資料,學(xué)生、課程以及成績(jī)的增刪改查都是建立在連接數(shù)據(jù)庫(kù)的基礎(chǔ)之上,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12深入SQL Server中char、varchar、text和nchar、nvarchar、ntext的區(qū)別詳
本篇文章是對(duì)char、varchar、text和nchar、nvarchar、ntext的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06故障的機(jī)器修好后重啟,狂拉主庫(kù)binlog,導(dǎo)致網(wǎng)絡(luò)問(wèn)題的解決方法
本文主要記錄一次簡(jiǎn)單的、典型的故障,發(fā)生問(wèn)題的原因很簡(jiǎn)單,這個(gè)問(wèn)題發(fā)生也很簡(jiǎn)單,各位同學(xué)一定要注意,一不留神就會(huì)對(duì)主庫(kù)造成影響2016-04-04mysql連接過(guò)多和死掉以及拒絕服務(wù)的解決方法
mysql連接過(guò)多和死掉以及拒絕服務(wù)的解決方法...2007-12-12mysql數(shù)據(jù)庫(kù)的全量與增量的備份以及恢復(fù)方式
在數(shù)據(jù)庫(kù)管理中,全量備份與恢復(fù)是將整個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)導(dǎo)出并在需要時(shí)完整地恢復(fù),這通常使用mysqldump工具完成,增量備份則是在全量備份的基礎(chǔ)上,只備份那些自上次全量備份后發(fā)生變化的數(shù)據(jù),這需要數(shù)據(jù)庫(kù)的二進(jìn)制日志(binlog)開(kāi)啟2024-09-09