Navicat 部落格

2018 年 1 月 30 日,由 Robert Gravelle 撰寫

MySQL 提供了幾乎無窮無盡的方法來處理重複資料。大多數可以使用一句語句進行更新或刪除。但是,有時必須發出多個命令才能完成工作。今天的文章將展示採用暫存資料表和 SELECT DISTINCT 查詢的方案。

MySQL 的永久與暫存資料表

注意,我們今天在這裡建立的暫存資料表與 MySQL 中的真正暫存資料表不同,因為我們沒有在 CREATE TABLE 語句中加入 TEMPORARY 關鍵字。

在 MySQL 中,暫存資料表是一種特殊類型的資料表,允許你儲存暫存的結果集,你可以在單個階段作業中多次重複使用該資料表。當無法使用單句 SELECT 語句查詢資料或成本很昂貴時,暫存資料表就會派上用場。就像使用 TEMPORARY 關鍵字建立的暫存資料表一樣,我們的「暫存」資料表將儲存 SELECT 查詢的即時結果,以便我們可以發出一個或多個其他查詢來完全處理資料。然後,我們會使用暫存資料表取代目標資料表。

刪除 amalgamated_actors 資料表中重複列

在「如何在 MySQL 中刪除具有不同 ID 的重複列(第 3 部分)」文章中,我們成功刪除了有重複名稱的列。但是,仍然會留下 ID 和名稱相同的列,換句話說,就是整列都是重複的列。例如,我們可以在下面的結果集中看到「22  JENNIFER  DAVIS」出現了兩次:

id     first_name     last_name
---------------------------------------------------
10 PENELOPE GUINESS
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

這是使用暫存資料表方法的理想例子。

MySQL 提供了特殊的 CREATE TABLE ... LIKE 命令,用於根據另一個資料表的定義建立一個空的資料表,包含原本資料表中定義的任何欄屬性和索引。

因此,我們可以 amalgamated_actors 資料表為基礎建立另一個表,如下所示:

-- Create temporary table
CREATE TABLE wp.temp_table LIKE wp.amalgamated_actors;

這語句將 amalgamated_actors 資料表中的所有資料複製至 temp_table

INSERT INTO wp.temp_table
    SELECT DISTINCT * FROM wp.amalgamated_actors;

SELECT DISTINCT 子句是刪除重複列的關鍵。

最後,我們需要重新命名原本的資料表,以便我們可以用暫存資料表取代它,並刪除原本的資料表:

-- Rename and drop
RENAME TABLE wp.amalgamated_actors TO wp.old_amalgamated_actors,
             wp.temp_table TO wp.amalgamated_actors;

DROP TABLE wp.old_amalgamated_actors;

現在只有一列 JENNIFER DAVIS

id     first_name     last_name
---------------------------------------------------
10 PENELOPE GUINESS
14 ED CHASE
22 JENNIFER DAVIS
23 JOHNNY LOLLOBRIGIDA
27 BETTE NICHOLSON
34 GRACE MOSTEL
41 NICK WAHLBERG
39 JOE SWANK
23 CHRISTIAN GABLE

我們原本的 amalgamated_actors 表已經被「暫存」資料表取代了。

使用 UNIQUE 約束條件刪除重複列

在下一篇關於處理重複資料的文章中,我們將使用 UNIQUE 約束條件刪除無論 ID 是否重複但具有重複名稱欄位的列。

Navicat 文章
頻道記錄
分享
部落格封存檔