Navicat 部落格

2018 年 1 月 16 日,由 Robert Gravelle 撰寫

大多數重複記錄屬於這兩類:重複意思和非唯一鍵。如何在 MySQL 中發現和刪除具有重複意思的值文章處理了重複意思類型的記錄。而後續文章中討論了如何識別非唯一鍵。這是在同一個資料表中的兩筆記錄具有相同的鍵,但是可能或未必有不同的值和意思。今天的文章將介紹如何刪除具有重複資料但具有不同鍵的列。

按類型識別重複項

在「如何識別具有非唯一鍵的重複項」文章中的最後一個查詢以易於查看的格式列出了所有重複項:

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 執行上述語句將針對資料表中的每一列!原因是我們實際上將每一列與該列本身配對!在下一篇文章中,我們將學習如何刪除像這樣具有非唯一鍵的列。

Navicat 文章
頻道記錄
分享
部落格封存檔