首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 刪除重複記錄三大經典方法總結(含索引保留技巧)

     編輯:MySQL 資料庫相關知識

測試表結構與數據


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),在應用層或數據庫約束層杜絕重複產生。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved