Mysql删除重复数据并且只保留一条(附实例!)

作者:怪?咖@ 时间:2024-01-27 04:48:27 

(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是不同的,现在要求是只留一条数据:

Mysql删除重复数据并且只保留一条(附实例!)

(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不就可以了,真的是这样吗?其实不是的,如下运行报错:

Mysql删除重复数据并且只保留一条(附实例!)

首先明确一点这个错误只会发生在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删除重复数据并且只保留一条(附实例!)

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

Mysql删除重复数据并且只保留一条(附实例!)

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

Mysql删除重复数据并且只保留一条(附实例!)

来源:https://blog.csdn.net/weixin_43888891/article/details/127336979

标签:删除,重复,保留
0
投稿

猜你喜欢

  • 用 prototype 定义自己的方法

    2010-03-17 20:44:00
  • Python利用PaddleOCR制作个搜题小工具

    2022-07-22 16:18:18
  • Python编程产生非均匀随机数的几种方法代码分享

    2023-02-10 02:00:19
  • pandas实现导出数据的四种方式

    2023-01-03 14:57:57
  • python 实现打印扫描效果详情

    2022-04-20 18:29:50
  • Python随机生成8位密码的示例详解

    2023-09-15 21:04:03
  • 页面中图像格式的选用之我见

    2007-10-31 18:11:00
  • MySQL 使用SQL语句修改表名的实现

    2024-01-17 09:14:31
  • python自定义类并使用的方法

    2022-08-16 14:36:29
  • 一文详解Golang中的切片数据类型

    2024-02-12 18:04:19
  • 详解Python验证码识别

    2023-11-12 23:46:40
  • Python实现通过解析域名获取ip地址的方法分析

    2023-08-14 16:10:29
  • 如何在Python3中使用telnetlib模块连接网络设备

    2022-03-11 12:57:33
  • python 在mysql中插入null空值的操作

    2022-09-24 09:48:40
  • MySQL表设计优化与索引 (八)

    2010-10-25 19:46:00
  • ASP 多关键词查询实例代码

    2011-04-11 11:14:00
  • 如何删除vue项目下的node_modules文件夹

    2023-07-02 17:10:00
  • 改变链接,让别人永远找不到你的程序

    2008-09-13 18:57:00
  • python实现事件驱动

    2022-01-07 10:20:48
  • 符合语言习惯的 Python 优雅编程技巧【推荐】

    2022-07-07 10:43:40
  • asp之家 网络编程 m.aspxhome.com