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;

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

猜你喜欢

转载自www.cnblogs.com/yoci/p/10238976.html