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