大多數重複記錄屬於這兩類:重複意思和非唯一鍵。如何在 MySQL 中發現和刪除具有重複意思的值文章處理了重複意思類型的記錄。而後續文章中討論了如何識別非唯一鍵。這是在同一個資料表中的兩筆記錄具有相同的鍵,但是可能或未必有不同的值和意思。今天的文章將介紹如何刪除具有重複資料但具有不同鍵的列。
![](https://www.navicat.com/link/Blog/Image/2018/20180116/duplicates3.png)
按類型識別重複項
在「如何識別具有非唯一鍵的重複項」文章中的最後一個查詢以易於查看的格式列出了所有重複項:
Repetitions | row_data | |
---------------------------------------------------------------- | ||
2 | 22 (DAVIS, JENNIFER) | 22 (DAVIS, JENNIFER) | |
2 | 23 (LOLLOBRIGIDA, JOHNNY) | 23 (GABLE, CHRISTIAN) | |
2 | 41 (WAHLBERG, NICK) | 12 (WAHLBERG, NICK) |
確定了所有重複的鍵和值後,我們就可以決定如何以最好方式處理冗餘資料。
JENNIFER DAVIS 出現在兩筆記錄中,具有相同的鍵 22,使這些列完全重複。NICK WAHLBERG 的名稱欄位是重複的,但 ID 不是。還有另一個重複的鍵 #23,是兩筆不相關的演員的記錄:「JOHNNY LOLLOBRIGIDA」和「CHRISTIAN GABLE」。關於 22 和 23 的重複鍵,第一個是真正的重複,而第二個只需要為其中一筆記錄產生新鍵就可解決。
使用 DELETE JOIN 刪除列
在「如何在 MySQL 中發現和刪除具有重複意思的值」文章中,我們透過執行搜尋和取代值,從而在 SELECT 結果集中刪除重複項。在這裡,我們將使用 DELETE JOIN 語句永久刪除其中一個重複的列。
由於我們正在比較同一個資料表中的欄位,因此我們必須將資料表連接到它的本身。我們可以在 WHERE 子句中比較id 來選擇保留較小或較大的id 號碼。以下語句保留最大的 id:
DELETE a FROM wp.amalgamated_actors a INNER JOIN wp.amalgamated_actors a2 WHERE a.id < a2.id AND a.first_name = a2.first_name AND a.last_name = a2.last_name; 1 row(s) affected 0.093 sec
在這種情況下,受影響(已刪除)的列是id 是 12 的 NICK WAHLBERG。快速的 SELECT 語句可確認結果:
id | first_name | last_name | ------------------------------------- | |
10 | PENELOPE | GUINESS | ||
12 | NICK | WAHLBERG | ||
14 | ED | CHASE | ||
22 | JENNIFER | DAVIS | ||
23 | JOHNNY | LOLLOBRIGIDA | ||
27 | BETTE | NICHOLSON | ||
34 | GRACE | MOSTEL | ||
39 | JOE | SWANK | ||
23 | CHRISTIAN | GABLE | ||
22 | JENNIFER | DAVIS |
如果你想保留最小的 id,你只需將 a.id < a2.id 運算式變更為 a.id > a2.id。
id | first_name | last_name | ------------------------------------- | |
10 | PENELOPE | GUINESS | ||
14 | ED | CHASE | ||
22 | JENNIFER | DAVIS | ||
23 | JOHNNY | LOLLOBRIGIDA | ||
27 | BETTE | NICHOLSON | ||
34 | GRACE | MOSTEL | ||
41 | NICK | WAHLBERG | ||
39 | JOE | SWANK | ||
23 | CHRISTIAN | GABLE | ||
22 | JENNIFER | DAVIS |
刪除具有非唯一鍵的列
對於 id 為 22 的 JENNIFER DAVIS 出現了兩次的情況,我們需要採用不同的方法。因為使用 a.id = a2.id 執行上述語句將針對資料表中的每一列!原因是我們實際上將每一列與該列本身配對!在下一篇文章中,我們將學習如何刪除像這樣具有非唯一鍵的列。