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 是否重複但具有重複名稱欄位的列。