首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 刪除重複數據通用方案:臨時表去重 + 截斷原表 + 回寫數據

     編輯:MySQL 資料庫相關知識

場景

表 test 中 title 字段存在重複,需保留唯一值(任意一條)。

標準四步法

-- 1. 創建去重臨時表(保留每組第一條)
CREATE TABLE bak AS
SELECT * FROM test GROUP BY title HAVING COUNT(*) = 1;

-- 2. 將重複組的第一條也插入臨時表
INSERT INTO bak
SELECT * FROM test GROUP BY title HAVING COUNT(*) > 1;

-- 3. 清空原表
TRUNCATE TABLE test;

-- 4. 回寫去重後數據
INSERT INTO test SELECT * FROM bak;

關鍵點解析

  • GROUP BY title 隱式取每組第一行(MySQL 允許非聚合列不在 GROUP BY 中,但結果不確定)。
  • HAVING COUNT(*) = 1 先處理無重複組,>1 再處理重複組,避免主鍵衝突(若有 PK)。
  • TRUNCATE 比 DELETE 快、重置自增 ID、不記錄 Binlog。

現代更優方案(MySQL 8.0+ / 大表)

-- 利用 ROW_NUMBER() 窗口函數精確保留每組第一行
CREATE TABLE test_dedup AS
SELECT * FROM (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY title ORDER BY id) AS rn
  FROM test
) t WHERE rn = 1;

RENAME TABLE test TO test_old, test_dedup TO test;
-- 重建索引/外鍵/權限
DROP TABLE test_old;
  • 窗口函數語義明確、性能穩定、可指定保留策略(如保留最新 ORDER BY id DESC)。
  • RENAME 原子切換,停機時間極短。

⚠️ 注意

  • 操作前**必須備份**。
  • 若表有外鍵被引用,需先刪除外鍵或級聯處理。
  • 大表建議在從庫或維護窗口執行。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved