Navicat使用教程:如何用非唯一鍵識別重復(fù)項
Navicat Premium是一個可連接多種數(shù)據(jù)庫的管理工具,它可以讓你以單一程序同時連接到MySQL、Oracle及PostgreSQL數(shù)據(jù)庫,讓管理不同類型的數(shù)據(jù)庫更加的方便。
大多數(shù)重復(fù)記錄分為兩類:重復(fù)意義和非唯一鍵。在MySQL文章中,如何識別和刪除具有重復(fù)意義的值涉及到重復(fù)意義;在這篇文章中,我們將討論如何識別非唯一鍵。這意味著同一表中的兩個記錄具有相同的鍵,但可能具有或不具有不同的值和含義。
形成機制
即使是設(shè)計良好的數(shù)據(jù)庫也可以累積非唯一的鍵重復(fù)。它通常是從外部源(如文本、csv或excel文件)以及數(shù)據(jù)源導(dǎo)入數(shù)據(jù)的結(jié)果。即使合并來自兩個不同數(shù)據(jù)庫的數(shù)據(jù),如果您以某種方式組合每個數(shù)據(jù)庫以生成一個新的鍵,也可能會創(chuàng)建重復(fù)的鍵——當(dāng)然,假設(shè)新的鍵列支持非唯一值。例如,連接兩個數(shù)字以生成一個新密鑰可能會有問題:
Key 1 Key 2 New Key -------------------------- 10 25 1025 102 5 1025 !!!
示例表
在支持復(fù)雜系統(tǒng)的數(shù)據(jù)庫中,防止出現(xiàn)重復(fù)鍵并不總是可行的。重要的是能夠在它們污染您的數(shù)據(jù)之前快速有效地處理它們。
讓我們首先從重疊鍵中分離出真正的重復(fù)值。
這是合并兩個參與者數(shù)據(jù)源的結(jié)果。你會注意到有幾個重復(fù)的名字,特別是“JENNIFER DAVIS”和“NICK WAHLBERG”:
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是我們在上篇文章中探討過的意義重復(fù)的例子。另一方面, JENNIFER DAVIS也出現(xiàn)在兩張唱片中,同一個鍵是22。還有一個與兩個無關(guān)的演員相關(guān)聯(lián)的復(fù)制鍵:“JOHNNY LOLLOBRIGIDA”和“CHRISTIAN GABLE”的復(fù)制鍵#23。對于22和23的重復(fù)鍵,第一個鍵是真正的重復(fù)鍵,而第二個鍵只需要為其中一個記錄生成一個新鍵。
識別和計數(shù)重復(fù)項
下面的查詢將標(biāo)識上表中共享公共ID的所有記錄。建議使用MySQL group_concat()函數(shù)在一行中將重復(fù)的行格式化在一起:
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)
如果希望同時查找所有重復(fù)項(即重復(fù)含義和非唯一鍵重復(fù)項),可以將上述查詢與使用UNION運算符檢查重復(fù)名稱的查詢結(jié)合起來:
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;
突出顯示一個結(jié)果集中的所有重復(fù)項:
Repetitions row_data ------------------------------------------------------------- 2 22 (DAVIS, JENNIFER) | 22 (DAVIS, JENNIFER) 2 23 (LOLLOBRIGIDA, JOHNNY) | 23 (GABLE, CHRISTIAN) 2 41 (WAHLBERG, NICK) | 12 (WAHLBERG, NICK)
結(jié)論
在MySQL中創(chuàng)建一個查詢來標(biāo)識重復(fù)的鍵相對簡單,因為您只需要在鍵字段上分組,并包含“Having COUNT(*) > 1”子句。以后的文章將回顧一些刪除重復(fù)行和更新鍵的不同方法。
購買Navicat Premium正版授權(quán),請點擊“”喲!