Mysql删除重复数据并且只保留一条(附实例!)
来源:脚本之家
时间:2023-02-25 09:20:06 195浏览 收藏
对于一个数据库开发者来说,牢固扎实的基础是十分重要的,golang学习网就来带大家一点点的掌握基础知识点。今天本篇文章带大家了解《Mysql删除重复数据并且只保留一条(附实例!)》,主要介绍了删除重复、保留,希望对大家的知识积累有所帮助,快点收藏起来吧,否则需要时就找不到了!
(1)以这张表为例:
CREATE TABLE `test` ( `id` varchar(32) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL COMMENT '注解id', `name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL COMMENT '名字', PRIMARY KEY (`id`) USING BTREE ) ENGINE = InnoDB CHARACTER SET = utf8 COLLATE = utf8_general_ci ROW_FORMAT = Compact; INSERT INTO test (id,`name`) VALUES (replace(uuid(),'-',''),'张三'),(replace(uuid(),'-',''),'张三');
表里有两条数据,然后名字是相同的,但是id是不同的,现在要求是只留一条数据:
(2)查询name值重复的数据:
现实开发当中可能一个字段无法锁定重复值,可以采取group by多个值!利用多个值来锁定重复的行数据!
SELECT name FROM test GROUP BY `name` HAVING count( name ) > 1
(3)查询重复数据里面每个最小的id:
SELECT min(id) as id FROM test GROUP BY `name` HAVING count( name ) > 1
(4)查询去掉重复数据最小id的其他数据:也就是要删除的数据!
SELECT * FROM test WHERE name IN ( SELECT name FROM test GROUP BY `name` HAVING count( name ) > 1 ) AND id NOT IN (SELECT min( id ) FROM test GROUP BY `name` HAVING count( NAME ) > 1)
(5)删除去掉重复数据最小id的其他数据:
可能这时候有人该说了,有了查询,直接改成delete不就可以了,真的是这样吗?其实不是的,如下运行报错:
首先明确一点这个错误只会发生在delete
语句或者update
语句,拿update来举例 : update A表 set A列 = (select B列 from A表);
这种写法就会报这个错误,原因:你又要修改A表,然后又要从A表查数据,而且还是同层级。Mysql就会认为是语法错误!
嵌套一层就可以解决,update A表 set A列 = (select a.B列 from (select * from A表) a);
当然这个只是个示例,这个示例也存在一定的问题,比如(select a.B列 from (select * from A表) a)
他会查出来多条,然后赋值的时候会报 1242 - Subquery returns more than 1 row
。
嵌套一层他就可以和update撇清关系,会优先查括号里面的内容,查询结果出来过后会给存起来,类似临时表,可能有的人该好奇了,update A表 set A列 = (select B列 from A表);
我明明加括号了呀,难道不算嵌套吗,当然不算,那个括号根本没有解决他们之间的层次关系!
详解看这篇文章:https://www.jb51.net/article/274025.htm
(6)正确的写法:
方式一:
DELETE FROM test WHERE name IN ( select a.name from (SELECT name FROM test GROUP BY `name` HAVING count( name ) > 1) a) AND id NOT IN (select a.id from (SELECT min(id) as id FROM test GROUP BY `name` HAVING count( name ) > 1) a)
注意:删除之前一定要先查询,然后再删除,否则一旦语法有问题导致删了不想删除的数据,想要恢复很麻烦!或者删除前备份好数据,不要嫌麻烦,一旦出问题,才是真正的大麻烦!
方式二:
DELETE FROM test WHERE id NOT IN ( SELECT t.id FROM ( SELECT MIN(id) as id FROM test GROUP BY NAME ) t)
(7)错误的写法: 这块我吃过一次亏,所以专门写出来,避免踩坑!
千万千万不能这么搞,下面这个语法相当于是先按name分组,然后查出来大于1的,这时候假如大于1的有很多,然后外面嵌套的那一层,只取了最小的一条数据,然后再加上使用的是
NOT IN
,最终会导致数据全部被删除!!!
执行前有四条数据,实际上我们要的是张三留下来一条,然后李四留下来一条
执行结果:只留下了一条!
总结
到这里,我们也就讲完了《Mysql删除重复数据并且只保留一条(附实例!)》的内容了。个人认为,基础知识的学习和巩固,是为了更好的将其运用到项目中,欢迎关注golang学习网公众号,带你了解更多关于mysql的知识点!
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
501 收藏
-
463 收藏
-
206 收藏
-
132 收藏
-
188 收藏
-
404 收藏
-
101 收藏
-
265 收藏
-
209 收藏
-
446 收藏
-
339 收藏
-
285 收藏
-
259 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 立即学习 542次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 立即学习 508次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 立即学习 497次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 立即学习 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 立即学习 484次学习