温故知新MySQL--如何在MySQL表中删除重复行
温故知新MySQL--如何在MySQL表中删除重复行
脱脂蛋丁 发表于4个月前
温故知新MySQL--如何在MySQL表中删除重复行
  • 发表于 4个月前
  • 阅读 2
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】如何购买服务器最划算?>>>   

如何在MySQL表中删除重复行

在实际应用中,会有需要删除重复数据的场景。这里简单介绍下如何删除重复的数据

1. 准备数据

CREATE IF NOT  EXISTS testdb;

USE testdb;

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

INSERT INTO contacts (first_name,last_name,email) 
VALUES ('Carine ','Schmitt','carine.schmitt@yiibai.com'),
       ('Jean','King','jean.king@gmail.com'),
       ('Peter','Ferguson','peter.ferguson@google.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'),
       ('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'),
       ('Roland','Keitel','roland.keitel@yahoo.com');

首先可以查询重复的内容,执行以下语句查询返回contacts表中的重复email值:

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

得到结果:

+-------------------------+--------------+
| email                   | COUNT(email) |
+-------------------------+--------------+
| janine.labrune@qq.com   |            2 |
| roland.keitel@yahoo.com |            2 |
| susan.nelson@qq.com     |            2 |
+-------------------------+--------------+
3 rows in set

可以看到,表中有重复的email行记录。

2. 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;

Query OK, 3 rows affected

如上所示,三行记录被删除。再次执行查询重复的语句:

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

返回空集,代表重复行已删除。

查询验证contacts表中的数据:

SELECT * 
FROM contacts

ID 为 4,7和9的行记录已被删除。

3. 直接表删除

以下是直接使用表删除重复行的步骤:

  • 创建一个新表,其结构与要删除重复行的原始表相同。
  • 将原始表中的不同行插入直接表。
  • 删除原始表并将直接表重命名为原始表。

步骤1 -

CRAETE TABLE source_copy FROM source;

步骤2 -

INSERT INTO source_copy
SELECT * FROM source
GROUP BY col;    --column that has duplicate value

步骤3 -

DROP TABLE source
ALTER TABLE source_copy RENAME TO source

例如,一下语句从 contacts 表中删除具有重复电子邮件(email)的行记录:

--step 1
CREATE TABLE contacts_temp
LIKE contacts;

--step 2
INSERT INTO contacts_temp(email) SELECT email FROM contacts GROUP BY email;

--step 3
DROP TABLE contacts;

ALTER TABLE contacts_temp
RENAME TO contacts;

 

共有 人打赏支持
粉丝 0
博文 5
码字总数 2710
×
脱脂蛋丁
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: