有時候遇到一些錯誤的資料庫,表中產生了一些重複的記錄,如何刪除多餘記錄就成了一件麻煩的事,今天看到一個巧妙的解決辦法,利用了MySQL的擴充特性,很簡單就完成了這項工作。
Why make this such a challenge?
Assuming your example:
CREATE TABLE bad_table2 (
id INT NOT NULL UNIQUE AUTO_INCREMENT,
name VARCHAR(20) NOT NULL
);
INSERT INTO bad_table2(id,name) VALUES
(1,'Things Fall Apart'),
(2,'Things Fall Apart'),
(3,'The Famished Road'),
(4,'Things Fall Apart'),
(5,'The Famished Road'),
(6,'Thirteen cents'),
(7,'Thirteen cents');
I can remove duplicates easily with the following line:
alter ignore table bad_table2 add unique index `unique_index` (name);
And then remove the added index.
alter table bad_table2 drop index `unique_index`;
Viola, dups gone.
這裡有兩個關鍵點,唯一索引和ignore關鍵字,MySQL對ignore的解釋如下:
IGNORE是MySQL相對於標準SQL的擴充。如果在新表中有重複關鍵字,或者當STRICT模式啟動後出現警告,則使用IGNORE控制ALTER
TABLE的運行。如果沒有指定IGNORE,當重複關鍵字錯誤發生時,複製操作被放棄,返回前一步驟。如果指定了IGNORE,則對於有重複關鍵字的行,只使用第一行,其它有衝突的行被刪除。並且,對錯誤值進行修正,使之盡量接近正確值。