文档章节

温故知新MySQL--如何在MySQL表中删除重复行

脱脂蛋丁
 脱脂蛋丁
发布于 2017/09/08 10:47
字数 540
阅读 2
收藏 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
作品 0
武汉
MySQL Replace语句

在本教程中,您将学习如何使用 MySQL的语句来插入或更新数据库表中的数据。 MySQL REPLACE语句介绍 MySQL的REPLACE语句是一个MySQL扩展于SQL标准的语句。 MySQL REPLACE语句的工作原理如下:...

易百教程
2016/09/20
12
0
MySQL基础教程

这是一个基础的MySQL教程,通过教程的学习后可以到达一个初级到中级 MySQL应用水平级别 ,主要介绍一些MySQL中基本的SQL语句。如果这是您第一次使用关系数据库管理系统(之前没有学习SQL相关...

易百教程
2016/10/11
37
0
MySQL常见建表选项及约束

一、CREATE TABLE 选项 1、在定义列的时候,指定列选项 1)DEFAULT :定义列的默认值   当插入一个新行到表中并且没有给该列明确赋值时,如果定义了列的默认值,将自动得到默认值 ;如果没...

jjjyyy66
2017/05/15
0
0
数据库索引类型和引擎

数据库索引类型和引擎 一、数据库索引 1、 索引的优缺点 优点:能够加快查询速度(相当于书的目录) 缺点:会降低插入、更新表的速度,需要占用磁盘存储空间 2、 索引的类型 INDEX:普通索引...

常楠
2014/05/11
0
0
Mysql中replace into用法详细说明

Replace into是Insert into的增强版。在向表中插入数据时,我们经常会遇到这样的情况:1、首先判断数据是否存在;2、如果不存在,则插入;3、如果存在,则更新。 在SQL Server中可以这样处理...

Junn
2013/02/25
0
0

没有更多内容

加载失败,请刷新页面

加载更多

20180920 rzsz传输文件、用户和用户组相关配置文件与管理

利用rz、sz实现Linux与Windows互传文件 [root@centos01 ~]# yum install -y lrzsz # 安装工具sz test.txt # 弹出对话框,传递到选择的路径下rz # 回车后,会从对话框中选择对应的文件传递...

野雪球
今天
1
0
OSChina 周四乱弹 —— 毒蛇当辣条

Osc乱弹歌单(2018)请戳(这里) 【今日歌曲】 @ 达尔文:分享花澤香菜/前野智昭/小野大輔/井上喜久子的单曲《ミッション! 健?康?第?イチ》 《ミッション! 健?康?第?イチ》- 花澤香菜/前野智...

小小编辑
今天
6
2
java -jar运行内存设置

java -Xms64m #JVM启动时的初始堆大小 -Xmx128m #最大堆大小 -Xmn64m #年轻代的大小,其余的空间是老年代 -XX:MaxMetaspaceSize=128m # -XX:CompressedClassSpaceSize=6...

李玉长
今天
1
0
Spring | 手把手教你SSM最优雅的整合方式

HEY 本节主要内容为:基于Spring从0到1搭建一个web工程,适合初学者,Java初级开发者。欢迎与我交流。 MODULE 新建一个Maven工程。 不论你是什么工具,选这个就可以了,然后next,直至finis...

冯文议
今天
1
0
RxJS的另外四种实现方式(四)——性能最高的库(续)

接上一篇RxJS的另外四种实现方式(三)——性能最高的库 上一篇文章我展示了这个最高性能库的实现方法。下面我介绍一下这个性能提升的秘密。 首先,为了弄清楚Most库究竟为何如此快,我必须借...

一个灰
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部