表 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。-- 利用 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 原子切換,停機時間極短。