CREATE TABLE demo (
id INT UNSIGNED PRIMARY KEY AUTO_INCREMENT,
site VARCHAR(100) NOT NULL
);
INSERT INTO demo (site) VALUES
('https://www.CodeBit.cn'),
('https://YITU.org'),
('https://www.ShuoWen.org'),
('https://www.CodeBit.cn'),
('https://www.ShuoWen.org');
重復判定依據:site 列值相同即為重復。
DELETE a FROM demo a
JOIN demo b ON a.site = b.site AND a.id > b.id;
結果保留 id=1,2,3。
DELETE a FROM demo a
JOIN demo b ON a.site = b.site AND a.id < b.id;
結果保留 id=2,4,5。
SELECT a.* FROM demo a
JOIN demo b ON a.site = b.site AND a.id > b.id;
ALTER IGNORE TABLE demo ADD UNIQUE INDEX ukey (site);
-- Query OK, 5 rows affected, 2 duplicates removed
神奇之處: IGNORE 關鍵字使重復鍵插入時自動忽略(實際為刪除重復行),保留第一條遇到的記錄。
去重後可選擇刪除索引:ALTER TABLE demo DROP INDEX ukey;
CREATE TABLE demo_new AS SELECT * FROM demo GROUP BY site;
-- 或 SELECT DISTINCT * FROM demo
然後重命名替換:
RENAME TABLE demo TO demo_old, demo_new TO demo;
SHOW CREATE TABLE demo; 獲取建表語句 → 按原結構創建新表 → INSERT INTO demo_new SELECT * FROM demo GROUP BY site; → 重命名參考「MySQL 當記錄不存在時插入」(INSERT IGNORE、ON DUPLICATE KEY UPDATE、REPLACE INTO),在應用層或數據庫約束層杜絕重複產生。