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