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','carine.schmitt@yiibai.com'),
	   ('Zbyszek ','Piestrzeniewicz','zbyszek.piestrzeniewicz@att.com'),
       ('Roland','Keitel','roland.keitel@yahoo.com'),
       ('Julie','Murphy','julie.murphy@yahoo.com'),
       ('Kwai','Lee','kwai.lee@google.com'),
       ('Jean','King','jean.king@qq.com'),
       ('Susan','Nelson','susan.nelson@qq.com'),
       ('Jean','King','jean.king@gmail.com'),
       ('Peter','Ferguson','peter.ferguson@google.com'),
       ('Jonas ','Bergulfsen','jonas.bergulfsen@mac.com'),
       ('Janine ','Labrune','janine.labrune@qq.com'),
       ('Susan','Nelson','susan.nelson@qq.com'),
       ('Janine ','Labrune','janine.labrune@qq.com'),
       ('Jonas ','Bergulfsen','jonas.bergulfsen@mac.com'),
       ('Janine ','Labrune','janine.labrune@qq.com'),
       ('Susan','Nelson','susan.nelson@qq.com'),    
       ('Roland','Keitel','roland.keitel@yahoo.com');

方式一 克隆表刪除重復的行

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

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

例如,以下語句從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;

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM