Navicat使用教程:如何在MySQL中定位和刪除有重複意義的值

下載Navicat Premium最新版本數據庫

Navicat Premium是一個可鏈接多種數據庫的管理工具,它可讓你以單一程序同時鏈接到MySQL、Oracle及PostgreSQL數據庫,讓管理不一樣類型的數據庫更加的方便。服務器

DBA最大的麻煩之一是處理重複數據。無論咱們如何防範,重複數據老是會設法進入到表格。重複數據是一個大問題,由於它會影響應用程序視圖(每一個項都應該是惟一的)、扭曲統計信息,在嚴重狀況下還會增長服務器開銷。工具

在本技巧中,咱們將學習如何識別MySQL中的重複數據,以及如何刪除它們而不刪除寶貴的有效數據。學習

Navicat

重複類型

您將遇到的大多數重複記錄是兩種不一樣類型之一:重複含義和非惟一鍵。在本篇文章中,咱們將處理重複含義;在下篇文章中,咱們將處理非惟一鍵。spa

當副本不是副本時

重複意義是最多見的重複類型。在這種狀況下,兩個或多個字段的內容不相同,但它們的含義是相同的。你能夠把它看做是語義上的重複數據。code

考慮下表摘錄:blog

1ci

2rem

3get

4

5

6

7

movie_name  media

---------------------------

ACADEMY DINOSAUR    Theatre

ACE GOLDFINGER  Television

ADAPTATION HOLES    Theatre

AFFAIR PREJUDICE    Theatre

AFRICAN EGG TV

在媒體專欄中,「Television」和「TV」兩個詞條的含義相同,但表達方式不一樣。這個問題一般是由使用自由文本輸入引發的,有限的下拉列表是更好的選擇。

這種類型的複製處理起來很是困難,由於不能使用select distinct排除重複項。

有兩種方法能夠解決這個問題:

1.使用replace()選擇數據,將不須要的值替換爲但願看到的值:

1

2

3

SELECT DISTINCT movie_name,

REPLACE(media, "TV""TELEVISION"as media,

FROM films;

2.更新實際表數據。下面是一個聲明,用首選的「TELEVISION」值更新「TV」的全部實例:

1

2

3

UPDATE films

SET media = REPLACE(media, "TV""TELEVISION")

WHERE media = "TV";

下面是一個真實的例子!

一些不須要的捲曲撇號進入了數據。注意「O'BRIEN」和「O'BRIEN」條目:

1

2

3

4

5

6

7

first_name  last_name

---------------------

PENELOPE    GUINESS

CONAN   O'BRIEN

ED  CHASE

JENNIFER    DAVIS

CONAN   O'BRIEN

咱們能夠像上面那樣處理這個問題:

1.使用replace()選擇數據,用常規的單引號替換大撇號,這樣咱們就能夠始終處理相同的字符:

1

2

3

4

SELECT DISTINCT first_name,

REPLACE(last_name, "'""'"as last_name,

FROM actors

WHERE REPLACE(last_name, "'""'"like "O'BRIEN";

2.更新實際表數據。此語句用常規單引號更新姓氏列中的全部撇號:

1

2

3

UPDATE actors

SET last_name = REPLACE(last_name, "'""'")

WHERE last_name like "%'%";

結論

重複記錄、雙精度、冗餘數據、重複行;不管您如何稱呼它們,它們都是DBA生命中最大的缺陷之一。然而,重要的是要按期清除它們,以避免產生錯誤的統計數據並混淆與數據庫交互的用戶。

相關文章
相關標籤/搜索