表 event:id (PK, AI)、sid (業務鍵)、detail。需保留每個 sid 的**最小 id** 記錄,刪除其餘重複行。
DELETE FROM event AS e
WHERE id != (SELECT MIN(id) FROM event WHERE sid = e.sid);
DELETE FROM event
WHERE sid NOT IN (
SELECT mid FROM (
SELECT sid, MIN(id) AS mid FROM event GROUP BY sid
) AS t
);
NOT IN 若子查詢結果含 NULL 會導致全表刪除,**sid 定義 NOT NULL 才安全**。ALTER IGNORE TABLE event ADD UNIQUE INDEX uniq_sid (sid);
ALTER TABLE event DROP INDEX uniq_sid;
IGNORE 讓重複鍵報警降級為警告,自動保留第一行刪除後續行。-- 1. 創建新表保留去重數據
CREATE TABLE event_dedup AS
SELECT * FROM event WHERE id IN (
SELECT MIN(id) FROM event GROUP BY sid
);
-- 2. 原子替換
RENAME TABLE event TO event_old, event_dedup TO event;
-- 3. 重建索引/外鍵/權限
-- 4. 驗證無誤後 DROP TABLE event_old;
CTAS (CREATE TABLE AS SELECT) 批量寫入新表,再 RENAME 原子切換,停機時間極短。IGNORE 依賴。