求知 文章 文库 Lib 视频 iPerson 课程 认证 咨询 工具 讲座 Model Center   Code  
会员   
要资料
 
 

mysql教程
MySQL快速学习入门
MySQL是什么
MySQL安装
MySQL示例数据库
MySQL导入示例数据库
MySQL基础教程
MySQL查询数据
MySQL WHERE语句
MySQL插入数据
MySQL更新表数据
MySQL删除表数据
MySQL创建与删除数据库
MySQL创建表
MySQL修改表结构
MySQL重命名表
MySQL数据类型
高级部分
MySQL技巧
MySQL存储过程
MySQL视图
MySQL触发器
MySQL管理
MySQL全文搜索
MySQL函数
应用程序连接
MySQL+Node.js连接和操作
Python+MySQL连接和操作
 
 

如何在MySQL表中删除重复行
683 次浏览
5次  

本教程将向您展示在MySQL中删除重复行的各种方法。

在上一个教程中,我们向您展示了如何在表中找到重复的值。当确定了表中有重复的行,您可能需要删除它们来清理这些不必要的数据。

准备示例数据

以下脚本创建contacts表,并将示例数据插入到用于演示的contacts表中。

USE testdb;
DROP TABLE IF EXISTS contacts;
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');

执行DELETE语句后,可以执行此脚本来重新创建测试数据。

以下查询返回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行记录。

使用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

如上所示,有3行记录已被删除。我们再次执行查找重复的电子邮件的查询:

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

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

我们来查询验证contacts表中的数据:

SELECT
*
FROM
contacts;

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

如果要删除重复的行并保留最低的ID,则可以使用以下语句:

DELETE t1 FROM contacts t1
INNER JOIN
contacts t2
WHERE
t1.id > t2.id AND t1.email = t2.email;

可以再次执行创建contacts表的脚本并测试此查询,以下输出显示删除重复行后的contacts表的数据。

使用直接表删除重复的行

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

创建一个新表,其结构与要删除重复行的原始表相同。

将原始表中的不同行插入直接表。

删除原始表并将直接表重命名为原始表。

以下查询说明了以下步骤:

步骤1 -

CREATE TABLE source_copy FROM source;

步骤2 -

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

步骤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;

在本教程中,您已经学习了如何使用DELETE JOIN语句或直接表删除MySQL中的重复行。


您可以捐助,支持我们的公益事业。

1元 10元 50元





认证码: 验证码,看不清楚?请点击刷新验证码 必填



683 次浏览
5次
 捐助