mysql表中删除重复记录,只保留一条记录的操作

mysql表中两个字段重复记录,只保留一条记录的操作

例如有一张学生表

其中name 和 class 相同的视为重复记录,需要保留一条记录,删除重复记录,

两种操作方式如下:

方法一: group by

java 复制代码
SELECT MIN(cs.id) AS id ,cs.`name` , cs.class  FROM `ceshi`  cs GROUP BY cs.`name` ,cs.`class`

查询结果如下:

此操作找出了需要保留的记录,即按name、class进行分组,取出id最小的记录,删除id不在上面的记录即可,最终保留的记录的id为1、3、4、5、6、8,原表中的2、7、9、10均为要删除的重复记录

删除sql如下:

java 复制代码
DELETE 
FROM
	`ceshi` cs
WHERE
	cs.`id` NOT IN (
	( SELECT MIN(cs.id) AS id   FROM `ceshi`  cs GROUP BY cs.`name` ,cs.`class`) )

方法二:关联,因为是同一张表,使用 left join 或者inner join都可以

直接写sql如下:

java 复制代码
delete t1
FROM ceshi t1
INNER JOIN ceshi t2
ON t1.`name` = t2.`name`
AND t1.`term` = t2.`term`
WHERE t1.id > t2.id;

同样是保留id较小的记录,原理如下:

运行选中的代码,此时未加条件WHERE t1.id > t2.id;

这是找出两张表中的name与class相同的记录的视图,加上判断条件WHERE t1.id > t2.id;

仅查看t1的情况

对比元数据表,可以看到t1表中是id较大的记录 2、7、9、10刚好就是重复的记录,所以直接使用上面的delete t1删除即可

相关推荐
一江寒逸1 分钟前
零基础从入门到精通MongoDB(附加篇):面试八股文全集
数据库·mongodb·面试
星晨雪海5 分钟前
Redis 分布式 ID 生成器
数据库·redis·分布式
有味道的男人12 分钟前
抖音关键词搜索,视频详情api
linux·数据库·音视频
丁丁点灯o12 分钟前
Oracle中金额数字转换为大写汉字
数据库·oracle
fly spider13 分钟前
MySQL之Buffer Pool
数据库·mysql
程序员老邢16 分钟前
【技术底稿 13】内网 Milvus 2.3.0 向量数据库全流程部署(商助慧 AI 底座,Attu 可视化)
java·数据库·人工智能·ai·语言模型·milvus
XDHCOM19 分钟前
ORA-38456: 属性集状态不一致,Oracle报错修复对比,远程处理方案选择
数据库·oracle
羊小蜜.22 分钟前
Mysql 14: 存储引擎——架构、引擎对比与锁机制
数据库·mysql·架构
爱学习的小囧23 分钟前
VM硬件版本20与17核心区别(ESXi 8.0适配+实操指南)
运维·服务器·网络·数据库·esxi·vmware·虚拟化
heimeiyingwang24 分钟前
【架构实战】Redis性能调优与内存优化策略
数据库·redis·架构