CREATE TABLE person_tbl ( first_name CHAR(20) NOT NULL, last_name CHAR(20) NOT NULL, PRIMARY KEY (last_name, first_name) );
INSERT IGNORE INTO person_tbl (last_name, first_name) VALUES ('Jay', 'Thomas');
REPLACE INTO person_tbl (last_name, first_name) VALUES ('Ajay', 'Kumar');
本質:DELETE + INSERT,觸發自增 ID 變化、外鍵級聯,慎用。
UNIQUE (last_name, first_name)
SELECT COUNT(*) AS repetitions, last_name, first_name FROM person_tbl GROUP BY last_name, first_name HAVING repetitions > 1;
-- DISTINCT SELECT DISTINCT last_name, first_name FROM person_tbl ORDER BY last_name; -- GROUP BY 等價 SELECT last_name, first_name FROM person_tbl GROUP BY last_name, first_name;
CREATE TABLE tmp SELECT last_name, first_name, sex FROM person_tbl GROUP BY last_name, first_name; DROP TABLE person_tbl; ALTER TABLE tmp RENAME TO person_tbl;
ALTER IGNORE TABLE person_tbl ADD PRIMARY KEY (last_name, first_name);
DELETE p1 FROM person_tbl p1 JOIN person_tbl p2 ON p1.last_name = p2.last_name AND p1.first_name = p2.first_name AND p1.id > p2.id;
| 場景 | 推薦方案 |
|---|---|
| 寫入防重 | 唯一索引 + INSERT IGNORE / ON DUPLICATE KEY UPDATE |
| 歷史去重(小表) | 臨時表法 |
| 歷史去重(大表) | DELETE JOIN 分批次、pt-archiver 線上遷移 |
| 查詢去重 | DISTINCT / GROUP BY |