下載Navicat Premium最新版本數據庫
Navicat Premium是一個可鏈接多種數據庫的管理工具,它可讓你以單一程序同時鏈接到MySQL、Oracle及PostgreSQL數據庫,讓管理不一樣類型的數據庫更加的方便。函數
大多數重複記錄分爲兩類:重複意義和非惟一鍵。在MySQL文章中,如何識別和刪除具備重複意義的值涉及到重複意義;在這篇文章中,咱們將討論如何識別非惟一鍵。這意味着同一表中的兩個記錄具備相同的鍵,但可能具備或不具備不一樣的值和含義。工具

造成機制
即便是設計良好的數據庫也能夠累積非惟一的鍵重複。它一般是從外部源(如文本、csv或excel文件)以及數據源導入數據的結果。即便合併來自兩個不一樣數據庫的數據,若是您以某種方式組合每一個數據庫以生成一個新的鍵,也可能會建立重複的鍵——固然,假設新的鍵列支持非惟一值。例如,鏈接兩個數字以生成一個新密鑰可能會有問題:spa
1設計 2excel 3code 4blog |
Key 1 Key 2 New Key ci -------------------------- rem 10 25 1025 102 5 1025 !!! |
示例表
在支持複雜系統的數據庫中,防止出現重複鍵並不老是可行的。重要的是可以在它們污染您的數據以前快速有效地處理它們。
讓咱們首先從重疊鍵中分離出真正的重複值。
這是合併兩個參與者數據源的結果。你會注意到有幾個重複的名字,特別是「JENNIFER DAVIS」和「NICK WAHLBERG」:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
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 41 NICK WAHLBERG 39 JOE SWANK 23 CHRISTIAN GABLE 22 JENNIFER DAVIS |
Nick Walberg是咱們在上篇文章中探討過的意義重複的例子。另外一方面, JENNIFER DAVIS也出如今兩張唱片中,同一個鍵是22。還有一個與兩個無關的演員相關聯的複製鍵:「JOHNNY LOLLOBRIGIDA」和「CHRISTIAN GABLE」的複製鍵#23。對於22和23的重複鍵,第一個鍵是真正的重複鍵,而第二個鍵只須要爲其中一個記錄生成一個新鍵。
識別和計數重複項
下面的查詢將標識上表中共享公共ID的全部記錄。建議使用MySQL group_concat()函數在一行中將重複的行格式化在一塊兒:
1 2 3 4 5 6 7 8 9 10 11 |
SELECT COUNT (*) as repetitions, group_concat(id, ' (' , last_name, ', ' , first_name, ') ' SEPARATOR ' | ' ) as row_data FROM amalgamated_actors GROUP BY id HAVING repetitions > 1; Repetitions row_data ------------------------------------------------------------- 2 22 (DAVIS, JENNIFER) | 22 (DAVIS, JENNIFER) 2 23 (LOLLOBRIGIDA, JOHNNY) | 23 (GABLE, CHRISTIAN) |
若是但願同時查找全部重複項(即重複含義和非惟一鍵重複項),能夠將上述查詢與使用UNION運算符檢查重複名稱的查詢結合起來:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
SELECT COUNT (*) as repetitions, group_concat(id, ' (' , last_name, ', ' , first_name, ') ' SEPARATOR ' | ' ) as row_data FROM amalgamated_actors GROUP BY id HAVING repetitions > 1 UNION SELECT COUNT (*) as repetitions, group_concat(id, ' (' , last_name, ', ' , first_name, ') ' SEPARATOR ' | ' ) as row_data FROM amalgamated_actors GROUP BY last_name, first_name HAVING repetitions > 1; |
突出顯示一個結果集中的全部重複項:
1 2 3 4 5 |
Repetitions row_data ------------------------------------------------------------- 2 22 (DAVIS, JENNIFER) | 22 (DAVIS, JENNIFER) 2 23 (LOLLOBRIGIDA, JOHNNY) | 23 (GABLE, CHRISTIAN) 2 41 (WAHLBERG, NICK) | 12 (WAHLBERG, NICK) |
結論
在MySQL中建立一個查詢來標識重複的鍵相對簡單,由於您只須要在鍵字段上分組,幷包含「Having COUNT(*) > 1」子句。之後的文章將回顧一些刪除重複行和更新鍵的不一樣方法。