萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 查詢與刪除重複記錄:單字段與多字段的 4 種 SQL 模式

數據庫中重複記錄會影響統計準確性與業務邏輯。本文提供基於 GROUP BY ... HAVING COUNT(*) > 1 模式的 4 類通用 SQL,涵蓋單字段/多字段的查詢與刪除(保留最小 ID)。

核心邏輯

重複判定標準:按指定字段分組,COUNT(*) > 1 即為重複組。刪除策略:保留每組 MIN(id),刪除其餘。

四種 SQL 模式

1. 單字段查詢重複記錄

SELECT * FROM user
WHERE name IN (
  SELECT name FROM user
  GROUP BY name
  HAVING COUNT(name) > 1
);

2. 單字段刪除重複(保留最小 ID)

DELETE FROM user
WHERE name IN (
  SELECT name FROM user
  GROUP BY name
  HAVING COUNT(name) > 1
)
AND id NOT IN (
  SELECT MIN(id) FROM user
  GROUP BY name
  HAVING COUNT(name) > 1
);

3. 多字段查詢重複記錄

SELECT * FROM user u
WHERE (u.name, u.age) IN (
  SELECT name, age FROM user
  GROUP BY name, age
  HAVING COUNT(*) > 1
);

4. 多字段刪除重複(保留最小 ID)

DELETE FROM user u
WHERE (u.name, u.age) IN (
  SELECT name, age FROM user
  GROUP BY name, age
  HAVING COUNT(*) > 1
)
AND id NOT IN (
  SELECT MIN(id) FROM user
  GROUP BY name, age
  HAVING COUNT(*) > 1
);

性能優化建議

  • 索引支援:重複檢測字段組合上建立聯合索引
  • 分批處理:大表刪除時分批次執行,避免長事務鎖表
  • 替代方案:MySQL 8.0+ 可用 ROW_NUMBER() OVER (PARTITION BY ... ORDER BY id) 窗口函數,單掃描完成標記與刪除
  • 預防機制:業務唯一性約束請在表級添加 UNIQUE INDEX,從源頭杜絕重複

驗證腳本

-- 驗證刪除後無重複
SELECT name, age, COUNT(*)
FROM user
GROUP BY name, age
HAVING COUNT(*) > 1;
-- 應返回空集合

這 4 條 SQL 覆蓋 90% 以上的去重場景,建議收藏備用。生產環境執行刪除前,務必先備份或在從庫驗證。

copyright © 萬盛學電腦網 all rights reserved