mysql删除重复数据,保留一条

场景

mysql数据表中有多条重复数据记录,现在想删除删除部分重复数据,保留最后一条更新或者插入的数据。

以学生表为例,我们创建一个简单的数据表来做实验:

create table student(
    id int ,
    user_name varchar(20),
    insert_time datetime
);

往表里面插入一些实验数据:

INSERT INTO `student`(`id`, `user_name`, `insert_time`) VALUES (1, '张三', '2021-04-08 11:57:46');
INSERT INTO `student`(`id`, `user_name`, `insert_time`) VALUES (1, '张三', '2021-04-08 12:57:46');
INSERT INTO `student`(`id`, `user_name`, `insert_time`) VALUES (1, '张三', '2021-04-08 13:57:46');
INSERT INTO `student`(`id`, `user_name`, `insert_time`) VALUES (1, '张三', '2021-04-08 14:57:46');
INSERT INTO `student`(`id`, `user_name`, `insert_time`) VALUES (1, '张三', '2021-04-08 15:57:46');
INSERT INTO `student`(`id`, `user_name`, `insert_time`) VALUES (2, '李四', '2021-04-08 12:57:46');
INSERT INTO `student`(`id`, `user_name`, `insert_time`) VALUES (2, '李四', '2021-04-08 13:57:46');
INSERT INTO `student`(`id`, `user_name`, `insert_time`) VALUES (2, '李四', '2021-04-08 14:57:46');
INSERT INTO `student`(`id`, `user_name`, `insert_time`) VALUES (2, '李四', '2021-04-08 15:57:46');
INSERT INTO `student`(`id`, `user_name`, `insert_time`) VALUES (3, '王五', '2021-04-08 11:57:46');
INSERT INTO `student`(`id`, `user_name`, `insert_time`) VALUES (3, '王五', '2021-04-08 15:57:46');
INSERT INTO `student`(`id`, `user_name`, `insert_time`) VALUES (4, '赵六', '2021-04-08 15:57:46');
image.png

解决思路一

我们可以根据分组查询先将重复数据查询出来,同时也可以获取到最后的更新时间,然后再与原表联表查询小于最大时间的数据,将查询出来的数据删除。
------先来慢慢消化-------

1、分组统计重复数据

在做删除前,我们可以先看看有哪些数据是有重复的:

SELECT id,user_name,COUNT(1) FROM `student` GROUP BY id,user_name HAVING(COUNT(1)>1);
image.png

可以看到张三,李四,王五的数据是有重复的,赵六没有重复,下面我们查找最后更新的记录。

2、查询最后更新的重复记录

SELECT id,user_name,MAX(insert_time) as max_time FROM `student` 
    GROUP BY id,user_name HAVING(COUNT(1)>1);

image.png

我们已经获取到最后更新的重复记录了,那么只要把除去这一部分的数据之外的记录删除即可,通过与原表关联查询,取出old.insert_time<new.max_time的数据进行删除即可。

3、先查询出待删除数据

SELECT a.* FROM student a ,(
    SELECT id,user_name,MAX(insert_time) as max_time FROM `student` 
        GROUP BY id,user_name HAVING(COUNT(1)>1)
) b WHERE a.id=b.id AND a.user_name=b.user_name AND a.insert_time<b.max_time;
image.png

可以看到,最后更新的数据为15:57:46的记录没有在结果中。

4、执行删除

DELETE a.* FROM student a ,(
    SELECT id,user_name,MAX(insert_time) as max_time FROM `student` 
        GROUP BY id,user_name HAVING(COUNT(1)>1)
) b WHERE a.id=b.id AND a.user_name=b.user_name AND a.insert_time<b.max_time;
image.png

image.png

可以看到重复记录已经被清理掉。
假如有两行记录是完全一样的,这个方法就不可行了,往表里面在跑一次数据插入:


image.png

执行删除计划:


image.png

image.png

可以看到表中完全一样的记录还在,这种情况下,该方法显然不足以满足需求。

解决思路二

创建一个临时表存放最后插入的一条数据(包含重复与没有重复的),然后清空原表,再将临时表的数据复制到原表中,最后把临时表删除。
这个很好理解,相当于ctrl+c,ctrl+v的操作,数据表如下:


image.png

1、创建临时表

CREATE TABLE student_temp LIKE student;

2、查询原表中存放的最后一条数据

SELECT id,user_name,MAX(insert_time) as max_time FROM `student` GROUP BY id,user_name;
image.png

3、将最后一条数据插入临时表中

INSERT INTO student_temp 
    SELECT id,user_name,MAX(insert_time) as max_time FROM `student` GROUP BY id,user_name;
image.png
image.png

4、清空原表

truncate student;
image.png

image.png

5、将临时表的数据复制到原表中

INSERT INTO student SELECT * FROM student_temp;
image.png

image.png

6、将临时表删除

DROP TABLE student_temp CASCADE;

这样数据去重就完成了,需要注意的是,如果表数据量很大,注意在group by 里面的字段建立索引,同时,生产环境注意好先进行数据备份操作

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,242评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,769评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,484评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,133评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,007评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,080评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,496评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,190评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,464评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,549评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,330评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,205评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,567评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,889评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,160评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,475评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,650评论 2 335

推荐阅读更多精彩内容