服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|数据库技术|

服务器之家 - 数据库 - Mysql - Mysql删除重复数据并且只保留一条(附实例!)

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

2023-03-20 14:47怪 咖@ Mysql

最近有朋友打电话寻求一个SQL相关的问题,大致是表中存在重复数据,需要删除掉重复数据保留一条的场景,下面这篇文章主要给大家介绍了关于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是不同的,现在要求是只留一条数据:

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表); 我明明加括号了呀,难道不算嵌套吗,当然不算,那个括号根本没有解决他们之间的层次关系!

详解看这篇文章:http://www.tuohang.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删除重复数据并且只保留一条(附实例!)

总结

到此这篇关于Mysql删除重复数据并且只保留一条的文章就介绍到这了,更多相关Mysql删除重复数据只保留一条内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文地址:https://blog.csdn.net/weixin_43888891/article/details/127336979

延伸 · 阅读

精彩推荐
  • Mysqlmysql更改引擎(InnoDB,MyISAM)的方法

    mysql更改引擎(InnoDB,MyISAM)的方法

    这篇文章主要介绍了mysql更改引擎(InnoDB,MyISAM)的方法,实例讲述了比较常见的几种更改引擎的方法,非常具有实用价值,需要的朋友可以参考下 ...

    shichen20144792020-04-22
  • Mysqlmysql kill process解决死锁问题

    mysql kill process解决死锁问题

    这篇文章主要介绍了使用mysql kill process解决死锁问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...

    xiaolyuh1236222022-08-24
  • MysqlMySQL删除外键时报错Error Code:1091. Can‘t DROP ‘XXX‘的解决方法

    MySQL删除外键时报错Error Code:1091. Can‘t DROP ‘XXX‘的解决方法

    这篇文章主要给大家介绍了关于MySQL删除外键时报错Error Code:1091. Can‘t DROP ‘XXX‘的解决方法,文中通过图文介绍的非常详细,对大家的学习或者工作具有一定...

    暗诺星刻6762022-08-31
  • MysqlMySQL 权限控制细节分析

    MySQL 权限控制细节分析

    这篇文章主要介绍了MySQL 权限控制细节分析的相关资料,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下...

    AsiaYe11672021-04-30
  • MysqlMySQL对limit查询语句的优化方法

    MySQL对limit查询语句的优化方法

    这篇文章主要介绍了MySQL对limit查询语句的优化方法,分别讲解了offset参数比较小和offset参数比较大的时候,如何优化查询语句,需要的朋友可以参考下 ...

    junjie4312020-04-10
  • MysqlMySQL数据库 JDBC 编程(Java 连接 MySQL)

    MySQL数据库 JDBC 编程(Java 连接 MySQL)

    这篇文章主要介绍了MySQL数据库 JDBC 编程Java 连接 MySQL,在 Java 中,这样的封装就是由 Java 标准库来完成的,封装出了一套统一的数据库 API 称为 JDBC,下面来看...

    吞吞吐吐大魔王7892022-01-22
  • MysqlmacOS 下的 MySQL 8.0.17 安装与简易配置教程图解

    macOS 下的 MySQL 8.0.17 安装与简易配置教程图解

    这篇文章主要介绍了macOS 下的 MySQL 8.0.17 安装与简易配置教程,本文图文并茂给大家介绍的非常详细,具有一定的参考借鉴价值,需要的朋友可以参考下...

    -小尤-3592020-12-06
  • MysqlWindows安装MySQL 5.7.18 解压版的教程

    Windows安装MySQL 5.7.18 解压版的教程

    这篇文章主要为大家详细介绍了Windows安装MySQL 5.7.18 解压版的详细教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下 ...

    Spade-A3572020-08-04