1. 程式人生 > >Mysql--刪除資料表重複行

Mysql--刪除資料表重複行

準備示例資料

以下sql建立表,並將示例資料插入到用於演示的contacts表中。

CREATE TABLE contacts (
    id INT PRIMARY KEY AUTO_INCREMENT,
    first_val VARCHAR(50) DEFAULT NULL,
    last_val VARCHAR(50) DEFAULT NULL, 
    email VARCHAR(255) NOT NULL
);

INSERT INTO contacts (first_val,last_val,email) 
VALUES ('Carine ','Schmitt','[email protected]
'), ('Zbyszek ','Piestrzeniewicz','[email protected]'), ('Roland','Keitel','[email protected]'), ('Julie','Murphy','[email protected]'), ('Kwai','Lee','[email protected]'), ('Jean','King','[email protected]'), ('Susan','Nelson','[email protected]
'), ('Jean','King','[email protected]'), ('Peter','Ferguson','[email protected]'), ('Jonas ','Bergulfsen','[email protected]'), ('Janine ','Labrune','[email protected]'), ('Susan','Nelson','[email protected]'), ('Janine ','Labrune','[email protected]
'), ('Jonas ','Bergulfsen','[email protected]'), ('Janine ','Labrune','[email protected]'), ('Susan','Nelson','[email protected]'), ('Roland','Keitel','[email protected]');

方式一 克隆表刪除重複的行**

以下是使用克隆/複製表刪除重複行的步驟

  • 克隆需要刪除重複資料的表 ,其結構與要刪除重複行的原始表相同。
  • 將原始表中的不同行插入直接表。
  • 刪除原始表修改原始表名並將克隆表重新命名為原始表

例如,以下語句從contacts表中刪除具有重複電子郵件(email)的行記錄:

-- step1 克隆/複製表結構
   CREATE TABLE contacts_temp LIKE contacts;

-- step2 資料不重複插入克隆表
   INSERT INTO contacts_temp(first_val,last_val,email) SELECT first_val,last_val,email FROM contacts  GROUP BY email;

-- step3 修改原始表以作備份,出錯可以還原
   ALTER TABLE contacts
   RENAME TO contacts_copy;

-- step4 修改原始表為克隆表
   ALTER TABLE contacts_temp 
   RENAME TO contacts;

方式二 DELETE JOIN 刪除重複行

以下查詢返回contacts表中的重複email值:

   SELECT
    email,
    COUNT( email ) 
   FROM
    contacts 
   GROUP BY
    email 
   HAVING
    COUNT( email ) > 1;

可以看到,表中有重複email行記錄。

使用DELETE JOIN語句刪除重複的行

MySQL提供了可用於快速刪除重複行的DELETE JOIN語句。

以下語句刪除重複的行並保持最高的ID:

   DELETE t1 
   FROM
    contacts t1
    INNER JOIN contacts t2 
   WHERE
    t1.id < t2.id 
    AND t1.email = t2.email;

重複行記錄已被刪除。我們再次執行查詢重複的電子郵件的查詢:

   SELECT
    email, COUNT( email ) 
   FROM
       contacts 
   GROUP BY
       email 
   HAVING
       COUNT( email ) > 1;

該查詢返回一個空集合,這意味著重複的行已被刪除。