首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 秒級去重:ALTER IGNORE TABLE 加唯一索引法

     編輯:MySQL 綜合教學

MySQL 秒級去重:ALTER IGNORE TABLE 加唯一索引法

面對幾百萬筆資料需要去重,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 8.0 替代方案

-- 1. 使用 ROW_NUMBER() 保留首筆
WITH ranked AS (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY id, NAME ORDER BY id) AS rn
  FROM test
)
DELETE FROM test WHERE (id, NAME) IN (
  SELECT id, NAME FROM ranked WHERE rn > 1
);

-- 2. 或建新表去重再 RENAME
CREATE TABLE test_dedup AS
SELECT * FROM test GROUP BY id, NAME;
RENAME TABLE test TO test_old, test_dedup TO test;

適用場景與風險

  • ✅ 適合:中小表(< 5000 萬行)、一次性清理、可接受「保留首筆」策略。
  • ❌ 不適合:需保留「最新筆」或依業務邏輯保留、表有外鍵被引用(加索引會鎖表)、MySQL 8.0 環境。
  • ⚠️ 風險:操作期間鎖表,生產庫建議低峰期或從庫執行。

這招「加索引去重」是 DBA 工具箱裡的利器,用對版本、用對場景,能把小時級清理壓縮到秒級。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
版本支援備註
MySQL 5.6 / 5.7✅ 支援顯示 Warning: 'IGNORE' is deprecated
MySQL 8.0+❌ 移除IGNORE 子句已廢除,語法報錯
MariaDB 10.2+✅ 支援保留相容性