Navicat使用教程:如何在MySQL中定位和刪除有重復(fù)意義的值
Navicat Premium是一個(gè)可連接多種數(shù)據(jù)庫的管理工具,它可以讓你以單一程序同時(shí)連接到MySQL、Oracle及PostgreSQL數(shù)據(jù)庫,讓管理不同類型的數(shù)據(jù)庫更加的方便。
DBA最大的麻煩之一是處理重復(fù)數(shù)據(jù)。不管我們?nèi)绾畏婪?,重?fù)數(shù)據(jù)總是會(huì)設(shè)法進(jìn)入到表格。重復(fù)數(shù)據(jù)是一個(gè)大問題,因?yàn)樗鼤?huì)影響應(yīng)用程序視圖(每個(gè)項(xiàng)都應(yīng)該是唯一的)、扭曲統(tǒng)計(jì)信息,在嚴(yán)重情況下還會(huì)增加服務(wù)器開銷。
在本技巧中,我們將學(xué)習(xí)如何識(shí)別MySQL中的重復(fù)數(shù)據(jù),以及如何刪除它們而不刪除寶貴的有效數(shù)據(jù)。
重復(fù)類型
您將遇到的大多數(shù)重復(fù)記錄是兩種不同類型之一:重復(fù)含義和非唯一鍵。在本篇文章中,我們將處理重復(fù)含義;在下篇文章中,我們將處理非唯一鍵。
當(dāng)副本不是副本時(shí)
重復(fù)意義是最常見的重復(fù)類型。在這種情況下,兩個(gè)或多個(gè)字段的內(nèi)容不相同,但它們的含義是相同的。你可以把它看作是語義上的重復(fù)數(shù)據(jù)。
考慮下表摘錄:
movie_name media --------------------------- ACADEMY DINOSAUR Theatre ACE GOLDFINGER Television ADAPTATION HOLES Theatre AFFAIR PREJUDICE Theatre AFRICAN EGG TV
在媒體專欄中,“Television”和“TV”兩個(gè)詞條的含義相同,但表達(dá)方式不同。這個(gè)問題通常是由使用自由文本輸入引起的,有限的下拉列表是更好的選擇。
這種類型的復(fù)制處理起來非常困難,因?yàn)椴荒苁褂胹elect distinct排除重復(fù)項(xiàng)。
有兩種方法可以解決這個(gè)問題:
1.使用replace()選擇數(shù)據(jù),將不需要的值替換為希望看到的值:
SELECT DISTINCT movie_name, REPLACE(media, "TV", "TELEVISION") as media, FROM films;
2.更新實(shí)際表數(shù)據(jù)。下面是一個(gè)聲明,用首選的“TELEVISION”值更新“TV”的所有實(shí)例:
UPDATE films SET media = REPLACE(media, "TV", "TELEVISION") WHERE media = "TV";
下面是一個(gè)真實(shí)的例子!
一些不需要的卷曲撇號(hào)進(jìn)入了數(shù)據(jù)。注意“O'BRIEN”和“O'BRIEN”條目:
first_name last_name --------------------- PENELOPE GUINESS CONAN O'BRIEN ED CHASE JENNIFER DAVIS CONAN O'BRIEN
我們可以像上面那樣處理這個(gè)問題:
1.使用replace()選擇數(shù)據(jù),用常規(guī)的單引號(hào)替換大撇號(hào),這樣我們就可以始終處理相同的字符:
SELECT DISTINCT first_name, REPLACE(last_name, "'", "'") as last_name, FROM actors WHERE REPLACE(last_name, "'", "'") like "O'BRIEN";
2.更新實(shí)際表數(shù)據(jù)。此語句用常規(guī)單引號(hào)更新姓氏列中的所有撇號(hào):
UPDATE actors SET last_name = REPLACE(last_name, "'", "'") WHERE last_name like "%'%";
結(jié)論
重復(fù)記錄、雙精度、冗余數(shù)據(jù)、重復(fù)行;無論您如何稱呼它們,它們都是DBA生命中最大的缺陷之一。然而,重要的是要定期清除它們,以免產(chǎn)生錯(cuò)誤的統(tǒng)計(jì)數(shù)據(jù)并混淆與數(shù)據(jù)庫交互的用戶。
購買Navicat Premium正版授權(quán),請(qǐng)點(diǎn)擊“咨詢?cè)诰€客服”喲!