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;
    

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

  • 相关阅读:
    Codeforces 235C Cyclical Quest 后缀自动机
    HDU-6583 Typewriter 后缀自动机+dp
    HDU-4436 str2int 后缀自动机
    [题解]诸侯安置(dp+组合)
    [题解]洛谷P1350车的放置
    二进制表示中1的个数与异或关系
    [洛谷P1593][POJ-1845Sumdiv] 因子和
    [USACO08DEC]拍头Patting Heads 题解
    [小白逛公园]|[SP1716]|[UVA1400]解题报告(三合一)
    P2034选择数字题解
  • 原文地址:https://www.cnblogs.com/yoci/p/10238976.html
Copyright © 2011-2022 走看看