目錄
一、查詢重復數據
二、刪除重復數據
方法 1:創建臨時表,操作完成后再刪除臨時表(安全可靠,適合大表)
????????步驟 1:創建臨時表存儲需刪除的 ID
? ? ? ? 步驟 2:根據臨時表刪除數據
方法 2:使用子查詢嵌套刪除重復記錄(簡潔高效,適合小表)
一、查詢重復數據
場景:按單個字段或多個字段分組,查詢重復組中的任意一條記錄。
方法:使用?GROUP BY
?+?MIN()
/MAX()
假設表中有主鍵(如?id
),按 name字段查詢重復數據,并保留每組中?id
?最小的記錄:
select MIN(id) AS id, -- 保留最小/最大的主鍵值name
from sys_user
GROUP BY name -- 按重復字段分組
HAVING COUNT(*) > 1; -- 篩選出重復組(計數>1)
注意:
- 聚合函數選擇:
- 使用?
MIN(id)
?保留最早的記錄 - 使用?
MAX(id)
?保留最新的記錄
- 使用?
- SELECT 字段限制:
- 非聚合字段(如
name
)必須出現在GROUP BY
中 - MySQL 5.7+ 默認啟用?
ONLY_FULL_GROUP_BY
?模式,需嚴格遵守此規則
- 非聚合字段(如
二、刪除重復數據
方法 1:創建臨時表,操作完成后再刪除臨時表(安全可靠,適合大表)
????????步驟 1:創建臨時表存儲需刪除的 ID
-- 1、刪除臨時表(如果存在)
DROP TABLE IF EXISTS temp_sys_user;-- 2、創建臨時表,存儲需要刪除的重復記錄ID
CREATE TABLE temp_sys_user AS (SELECTa.idFROMsys_user aWHERE(-- 指定需要去重的字段,可根據實際情況添加更多字段a.name) IN (SELECTc.nameFROMsys_user cGROUP BYc.nameHAVINGCOUNT(*) > 1)AND a.id NOT IN (SELECTMIN(b.id)FROMsys_user bGROUP BYb.usernameHAVINGCOUNT(*) > 1)
);
? ? ? ? 步驟 2:根據臨時表刪除數據
-- 1、根據臨時表刪除sys_user表中的重復數據
DELETE FROM sys_user WHERE id IN (SELECT id FROM temp_sys_user );-- 2、刪除臨時表,釋放資源
DROP TABLE IF EXISTS temp_sys_user ;
好處:
- 避免直接操作原表,減少死鎖風險
- 支持復雜篩選條件
- 適合處理百萬級數據
方法 2:使用子查詢嵌套刪除重復記錄(簡潔高效,適合小表)
DELETE FROM sys_user WHERE id IN (SELECT id FROM (SELECT idFROM sys_user aWHERE (-- 指定需要去重的字段,保持與方法1一致a.name) IN (SELECT nameFROM sys_userGROUP BY nameHAVING COUNT(*) > 1)AND a.id NOT IN (SELECT MIN(id)FROM sys_userGROUP BY nameHAVING COUNT(*) > 1)) AS temp
);
注意:備份數據!備份數據!備份數據!
(重要的事情說三遍,防止操作失誤導致數據丟失)