面對幾百萬筆資料需要去重,DELETE JOIN 或臨時表法耗時較久。MySQL 5.7 前提供一招極簡做法:加唯一索引並忽略錯誤,自動刪除重複列,秒級完成。
-- 1. 建測試表並插入重複資料
DROP TABLE IF EXISTS test;
CREATE TABLE test (id INT, NAME VARCHAR(10));
INSERT INTO test VALUES (1,'a1'),(2,'a2'),(3,'a3'),(4,'a4'),(1,'a1');
-- 2. 查看重複
SELECT * FROM test;
-- +------+------+
-- | id | NAME |
-- +------+------+
-- | 1 | a1 |
-- | 2 | a2 |
-- | 3 | a3 |
-- | 4 | a4 |
-- | 1 | a1 | ← 重複
-- +------+------+
-- 3. 一鍵去重(保留第一筆)
ALTER IGNORE TABLE test ADD UNIQUE INDEX idx_id_name (id, NAME);
-- Query OK, 5 rows affected, 1 warning (0.02 sec)
-- Records: 5 Duplicates: 1 Warnings: 1
-- 4. 驗證結果
SELECT * FROM test;
-- +------+------+
-- | id | NAME |
-- +------+------+
-- | 1 | a1 |
-- | 2 | a2 |
-- | 3 | a3 |
-- | 4 | a4 | ← 重複已移除
-- +------+------+
IGNORE:告訴 MySQL 遇到重複鍵錯誤不中斷,直接丟棄當前行並繼續。UNIQUE INDEX:定義唯一性約束,重複行違反約束被 IGNORE 丟棄。| 版本 | 支援 | 備註 |
|---|---|---|
| MySQL 5.6 / 5.7 | ✅ 支援 | 顯示 Warning: 'IGNORE' is deprecated |
| MySQL 8.0+ | ❌ 移除 | IGNORE 子句已廢除,語法報錯 |
| MariaDB 10.2+ | ✅ 支援 | 保留相容性 |