zoukankan      html  css  js  c++  java
  • 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;
    

    该查询返回一个空集合,这意味着重复的行已被删除。

  • 相关阅读:
    luoguP4389 付公主的背包 多项式exp
    bzoj3456 城市规划 多项式求In
    luoguP4491 [HAOI2018]染色 广义容斥原理 + FFT
    计蒜之道2019复赛题解
    Educational Codeforces Round 66 (Rated for Div. 2)
    [CodeChef-ANUDTQ] Dynamic Trees and Queries
    M-SOLUTIONS Programming Contest
    Codeforces Global Round 3
    PKUSC2019题解
    [LOJ#3120][Luogu5401][CTS2019]珍珠(容斥+生成函数)
  • 原文地址:https://www.cnblogs.com/yoci/p/10238976.html
Copyright © 2011-2022 走看看