0


MySQL怎样删除重复数据,只保留一条?

在实际工作开发过程中,常常会遇到数据库表中存在多条数据重复了,此时我们需要删除重复数据,只保留其中一条有效的数据;

针对这种场景,我们用SQL语句该怎么实现呢?

数据准备

建表语句:

DROPTABLEIFEXISTS`test`;CREATETABLE`test`(`id`int(11)NULLDEFAULTNULL,`name`varchar(255)CHARACTERSET utf8mb4 COLLATE utf8mb4_general_ci NULLDEFAULTNULL)ENGINE=InnoDBCHARACTERSET= utf8mb4 COLLATE= utf8mb4_general_ci ROW_FORMAT = Dynamic;INSERTINTO`test`VALUES(1,'张三');INSERTINTO`test`VALUES(2,'李四');INSERTINTO`test`VALUES(4,'张三');INSERTINTO`test`VALUES(5,'王二');INSERTINTO`test`VALUES(6,'护具');INSERTINTO`test`VALUES(7,'无极');INSERTINTO`test`VALUES(8,'护具');INSERTINTO`test`VALUES(3,'空气');INSERTINTO`test`VALUES(9,'王二');INSERTINTO`test`VALUES(10,'几乎');commit;

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

查看重复数据,并筛选

select t.name,count(1)from test t where1=1groupby t.name ;

在这里插入图片描述

使用having语句进行筛选

select t.name,count(1)from test t where1=1groupby t.name HAVINGcount(1)>1;

在这里插入图片描述

对于重复数据,保留一条数据筛选

select t.name,min(id)as  id ,count(1)from test t where1=1groupby t.name;

在这里插入图片描述

删除重复数据

deletefrom test where id notin(selectmin(id)from test t where1=1groupby t.name );

执行上述SQL语句,发现会报错:

delete from test where id not in (
select  min(id)  from test t where 1=1 group by t.name )
> 1093 - You can't specify target table 'test' for update in FROM clause
> 时间: 0.004s

导致这一原因的问题是:不能在同一表中查询的数据作为同一表的更新数据。

正确参考SQL:

(1) 创建一张表temp_table存储最终保留的数据。
createtable temp_table asSELECTmin( id )as id FROM test t WHERE1=1GROUPBY t.NAME;(2) 排除表temp_table中的数据,删除即可。
DELETEFROM test WHERE id NOTIN(SELECT*FROM temp_table);

成功删除重复数据!

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
在这里插入图片描述

标签: MySQL

本文转载自: https://blog.csdn.net/weixin_43759352/article/details/132570809
版权归原作者 xxkfz 所有, 如有侵权,请联系我们删除。

“MySQL怎样删除重复数据,只保留一条?”的评论:

还没有评论