(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://blog.csdn.net/weixin_43888891/article/details/127000534

(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
WHEREid NOT IN (SELECTt.id
FROM( SELECT MIN(id) as id FROM test GROUP BY NAME ) t)

(7)错误的写法: 这块我吃过一次亏,所以专门写出来,避免踩坑!

千万千万不能这么搞,下面这个语法相当于是先按name分组,然后查出来大于1的,这时候假如大于1的有很多,然后外面嵌套的那一层,只取了最小的一条数据,然后再加上使用的是NOT IN,最终会导致数据全部被删除!!!

执行前有四条数据,实际上我们要的是张三留下来一条,然后李四留下来一条

执行结果:只留下了一条!

Mysql删除重复数据只保留一条相关推荐

  1. MySql删除重复数据(只保留一条)

    MySql删除重复数据 1. 问题引入 前一段遇到MySql数据重复的问题.由于重复向同一张表导入同一批数据,导致前台展示的数据重复,唯一方便快捷的方法莫过于利用delete操作删除重复数据(已经封板 ...

  2. mysql删除重复数据只保留一条_mysql查找删除重复数据并只保留一条实例详解

    有这样一张表,表数据及结果如下: school_id school_name total_student test_takers 1239 Abraham Lincoln High School 55 ...

  3. mysql 删除重复数据只保留一条记录

    删除重复数据保留name中id最小的记录 delete from order_info where id not in (select id from (select min(id) as id fr ...

  4. mysql删除重复数据只保留一条_【SQL】mysql删除重复数据只保留一条

    清洗数据的时候,发现有重复数据. 之前多用EXCEL处理数据,一键就可以delete了.这次因为数据量相对较大换了mysql. 按照百度搜到的一个高票代码,运行了半天都不对. 一直报错: 即按照mys ...

  5. sql 删除重复数据 只保留一条

    oracle 删除重复数据 只保留一条 DELETE from t_ows_compelete_rfc WHERE operation_no is null IN ( SELECT operation ...

  6. mysql 删除重复数据 保留一个_MySQL学习笔记-删除重复数据只保留一条

    有这样一张表,表数据及结果如下: 可以看出,school_name的字段值有重复数据(Abraham Lincoln High School 和Agoura High School分别出现两次),那么 ...

  7. MySQL删除重复数据只保留最新的一条

    MySQL删除重复数据并保留最新的一条,网上有些博客写的有问题,因为他们只考虑到或者说他们的重复数据最多只有两条,当重复数据大于2时,就会出现问题. 案例描述: 按天删除表中重复数据只保留最新的一条( ...

  8. MySQL 中删除重复数据只保留一条

    WechatIMG256.jpeg 场景 在许多条记录里,存在着些相同的记录,使用SQL语句,删除掉重复项只保留一条. 数据模型 half_demon 半妖表 id name weapon skill ...

  9. MySQL中删除重复数据只保留一条

    用SQL语句,删除掉重复项只保留一条 在几千条记录里,存在着些相同的记录,如何能用SQL语句,删除掉重复的呢 1.查找表中多余的重复记录,重复记录是根据单个字段(peopleId)来判断 SELECT ...

最新文章

  1. 【jquery】用jsp写jquery的模板
  2. VMWare 6.0桥接模式虚拟机网络配置
  3. C. Anton and Making Potions 贪心 + 二分
  4. 阿里云IoT何云飞:智物Cloud AIoT Native 为何能让设备智能更快一步
  5. 第一次摸服务器遇到的问题总结
  6. 我的世界连锁挖矿下载JAVA_我的世界1.7.10连锁挖矿整合包
  7. 关于华硕主板“USB Devices Over Current Status Detected!”
  8. 数目nullRQNOJ-302-统计单词个数--区域dp
  9. dial up network
  10. lempel ziv matlab,基于Python的LempelZiv算法的熵估计
  11. 制作网页先写html还是css,制作网页是先学html还是css
  12. css代码样式大全(整理版)
  13. 金山软件遭遇“35岁危机”,曾经风光无限,如今谁能养老?
  14. Postgresql 客户端连接问题
  15. 可以用计算机控制手机的软件,还有这样的神奇软件!让你用PC操控手机的神器...
  16. asp.net政府企业网站前台+后台源码
  17. 事件参数screenX、pageX、clientX 、offsetX的区别
  18. csdn竟然还有这种神器!后悔没有早点知道!超好用的csdn插件,别再犹豫了,赶快入手吧!
  19. STM32笔记20--电容触摸实验/IIC协议
  20. 共模电压你了解多少?陈老师带你搞清楚

热门文章

  1. if-elif语句的使用方法【Python培训】
  2. 2019 美国大学生数学建模竞赛(MCM/ICM)赛后回忆
  3. java 变量值变化检测_Java 9.5 测试复盘
  4. 使用QQ2013时连接Android物理设备Eclipse发现不了
  5. 【C语言】将大字母变成小写字母,小写字母变成大写字母,其他字符正常输出
  6. 定义python函数时如果没有return_python如何定义函数
  7. 详解序列化与反序列化
  8. ROS与gazebo中常见问题【持续更新中】
  9. 计算机网络安全通信的实现方法,一种计算机网络安全通信的实现方法及系统的制作方法...
  10. Java生成随机字符串