MySQL大量脏数据,如何只保留最新的一条?
因为系统的一个Bug,导致数据库表中出现重复数据,需要做的是删除重复数据且只保留最新的一条数据。
(相关资料图)
具体场景是这样的
有张订单关联额外费用表,而且一个订单号(order_no)记录只能关联同一个费用(cost_id)一次,但是数据库中出现了同一个订单号关联同一个费用n次
当然有人会说上面的问题我们可以建一个 order_no
+ cost_id
的组合唯一索引,这样就算代码有bug但至少数据库表中不会有脏数据。
似乎这样就可以了,然而事情并没有那么简单。
因为我们表中的数据在删除的时候不会真的的删除,而是采用逻辑删除,会有一个 deleted
字段使用0,1标识未删除与已删除。
当然 我们也可以考虑将 order_no
+ cost_id
+ deleted
组合成一个联合唯一索引。
这样就ok了吗?
其实会有一个新的问题,就是如果同一个订单同一个费用如果被删除一次。再去删除会发现无法成功进行此操作,因为该条数据已经存在了,不能在删除了。
所以当时我们并没有建立联合唯一索引,才导致脏数据的产生。
其实上面这种场景网上有个比较好的解决方案,就是我们依旧可以将 order_no + cost_id + deleted 组合成一个联合唯一索引,但是删除的时候deleted不再是固定的1,而是当前的主键ID,也就是deleted不等于0都是删除状态,如果删除了那deleted值=id
言归正传,接下来我们来讲下该如何修复脏数据的问题
我们先创建一张订单关联费用表
CREATE TABLE `order_cost_detail` ( `id` int NOT NULL AUTO_INCREMENT COMMENT "主键", `order_no` varchar(32) NOT NULL COMMENT "订单号", `cost_id` int NOT NULL COMMENT "费用Id", `cost_name` varchar(50) NOT NULL DEFAULT "" COMMENT "费用名称", `money` decimal(10,2) NOT NULL COMMENT "金额", `create_time` datetime NOT NULL COMMENT "创建时间", `deleted` tinyint(1) NOT NULL COMMENT "是否删除(0 否,1 是)", PRIMARY KEY (`id`) USING BTREE) ENGINE=InnoDB AUTO_INCREMENT=1 COMMENT="订单 - 费用表";
插入一些模拟数据
INSERT INTO `order_cost_detail` (`id`, `order_no`, `cost_id`, `cost_name`, `money`, `create_time`, `deleted`)VALUES(1, "EX202208160000012-3", 2, "停车费", 100.00, "2022-08-19 11:30:48", 0),(2, "EX202208160000012-4", 3, "停车费", 100.00, "2023-02-17 11:25:27", 0),(3, "EX202208160000012-4", 3, "停车费", 200.00, "2023-02-17 11:25:28", 0),(4, "EX202208170000002-1", 1, "路桥费", 300.00, "2022-08-19 11:31:57", 0),(5, "EX202208170000002-1", 1, "路桥费", 450.00, "2022-08-19 11:32:57", 0),(6, "EX202208180000002-1", 2, "高速费", 225.00, "2022-08-19 11:35:41", 0);
我们的目的很明确,就是要删除 多余的同一订单号费用相同的数据,同时保留最新的一条数据。
我们可以先用sql看下是否有重复数据
SELECT order_no, cost_name, count(*) AS numFROM order_cost_detailWHERE deleted = 0GROUP BY order_no, cost_nameHAVING num > 1
运行结果
发现有两个订单有脏数据,如果实际生产只有两条脏数据那简单,直接查询这两个订单,把重复数据删掉就好了。
但如果有几十条甚至上百条数据呢,总不能一条一条的删吧。
一般我们删除重复数据都会保留最新的那条,所以我们可以这样做
如果主键是自增的,那么重复数据删除的时候,主键最大的一条就是需要保留的,如果主键不是自增的,我们可以根据创建时间,保留创建时间最大的记录
我们先看下,我们需要删除的记录
select *from order_cost_detailwhere id not in (select max(id) as numfrom order_cost_detailwhere deleted = 0group by order_no, cost_name)
查询结果
根据结果来看确实是这两条记录需要删除,那么我们开始执行删除操作
sql如下
-- 这里是逻辑删除,也就是将需要删除的数据打上deleted = 1 标记update order_cost_detailset deleted = 1where id in (select id from order_cost_detail where id not in (select max(id) as num from order_cost_detail where deleted = 0 group by order_no, cost_name))
执行的时候发现报错了
You can"t specify target table "order_cost_detail" for update in FROM clause
它的意思是说,不能在同一语句中,先select出同一表中的某些值,再update这个表,即不能依据某字段值做判断再来更新某字段的值。
这个问题在MySQL官网中有提到解决方案:拉到文档下面 https://dev.mysql.com/doc/refman/8.0/en/update.html
解决方法:select 的结果再通过一个中间表 select 多一次,就可以避免这个错误
update order_cost_detailset deleted = 1where id in (select t.idfrom( select id from order_cost_detail where id not in (select max(id) as num from order_cost_detail where deleted = 0 group by order_no, cost_name )) t)
执行成功
阿里巴巴手册索引规范,第一条就是
【强制】业务上具有唯一特性的字段,即使是组合字段,也必须建成唯一索引。
说明
:不要以为唯一索引影响了insert速度,这个速度损耗可以忽略,但提高查找速度是明显的:另外,即使在应用层做了非常完善的校验和控制,只要没有唯一索引,根据墨菲定律,必然有脏数据产生。
声明: 公众号如需转载该篇文章,发表文章的头部一定要 告知是转至公众号: 后端元宇宙。同时也可以问本人要markdown原稿和原图片。其它情况一律禁止转载!
标签:
- MySQL大量脏数据,如何只保留最新的一条?
- 精彩看点:盛迪科技2022年净利1062.15万 同比增加35.64% 控制期间费用
- 广西平南发生一起气体中毒事故 致2人死亡
- 环球速读:高合HiPhi X/Z预计三季度开始在欧洲销售
- 大东方(600327.SH):拟以3000万-5000万元回购公司股份
- Python面向对象编程-生成器
- 选择大城市逐梦还是小城市安稳
- 综述:中国企业借汉诺威工博会出海拓商机
- 【奋进的春天】“技术+服务”直接送进“棚” 洛川农机专家这样帮农户~
- 历史题材舞剧《张骞》亮相“新时代舞台艺术优秀剧目展演”|环球今热点
- 国乒迎内战!刘国梁亲自点拨王曼昱,钱天一教练立功,或晋级4强|环球报资讯
- 社会现象议论文 社会现象有哪些
- 化学、化工板块震荡走低
- 玩飞盘啦!
- 【环球快播报】超前点映|下周一,泰州消防邀您一起免费观影!
- 环球信息:银行“抢滩”绿色信贷市场 有股份行规模超越大行、城农商行超越股份行
- 446箱超标“蓝涧”饮用水销往京津,中宝饮用水公司被罚5万元 焦点日报
- 天天实时:债务率和负债率有什么区别 区别有这几点
- 填志愿前一定要看!2023年长沙城区小升初招生指南来了!
- 切开的牛油果没熟怎么办 牛油果切开还是硬了怎么办
- 中国第一传感器巨头利润惨跌98%!但仍被市场看好!未来可期!
- 陈吉宁会见德国大众汽车集团董事长奥博穆
- 环球简讯:2023重庆巫山灵活就业人员社保补贴怎么申请?线上线下两种方式
- 聘民事债务纠纷律师收费明细-世界时快讯
- 【全球新要闻】毛利率跌破20%!多款车型降价,特斯拉一季度净利跌超两成
- 快播:鼓楼小学学子赛场争锋,舍我“棋”谁
- 腾讯要分派快手了?9年投资已豪赚200亿!
- 两获国奖,四项专利!“失败远比成功多”的他获世界大奖
- 油漆固化剂的作用是什么_油漆固化剂的作用
- 中山东凤开展提升市容环境秩序专项整治 打通群众“生命通道”_全球快看
- 京东分拆上市 多角度计算潜在价值 世界球精选
- 感觉自己得了痔疮怎么办 得了痔疮怎么办
- 春日江南 纷繁金陵 全球新视野
- “聪明车”驶上“智慧路”
- 黄金T+N2价格今天多少一克(2023年4月19日) 环球动态
- 百公里油耗仅3.58L 长城1.5L炫丽已上市 全球通讯
- 热文:电脑抠图软件推荐_电脑抠图
- 信达生物公布KRASG12C抑制剂I期临床研究新数据:信达生物在2023年美国癌症研究协会年会(AACR2023)以报告形式公布IBI351(KRASG12C抑制剂)单药治疗晚期实体瘤患者的I期临床研究(NCT05005234)的结果。研究结果显示_环球快报
- 北京奥林匹克公园网红唱歌_北京奥林匹克公园网球中心
- 格兰仕光波炉的使用方法图解视频_格兰仕光波炉的使用方法
- 神控天下漫画全集观看在那看_神控天下漫画 观热点
- 当前热议!东莞滨海湾新区举办第三代半导体产业发展趋势专题讲座
- 天天看点:国家市场监管总局:严厉查处网络直播虚假宣传等不正当竞争行为
- 全球焦点!港股内房板块午后走低,碧桂园一度跌超5%
- 环球快看点丨北京长峰医院院长王某玲等12人被刑拘
- 国匠华发“优+产品体系5.0”启新典礼,珠海国际会展中心即将闪耀启幕!
- 可以贷款20万的平台有哪些 高额度贷款平台推荐-快看
- 皇马科技:皇马科技公司是目前国内品种较全、规模较大、科技含量较高的特种表面活性剂龙头引领企业
- vivoy76s如何截屏|今日关注
- 上海:完善国有创业投资机构的投资决策和业绩考核机制_环球热议
- 快播:美银行业:美国经济疲软 消费者开始拖欠信贷还款
- ?公积金月汇缴额是什么?|当前热议
- 焦点滚动:传媒板块爆发,影视股表现亮眼,唐德影视、华策影视等大涨
- 天天报道:首宗封顶!松山湖王者归来!楼面价26000元,金地的
- 托莫里:迈尼昂不仅仅是一名门将,我们需要他时他就在那里
- 辽宁最低估球员现身!全场拿捏利夫,球迷调侃虚报年龄,这是真猛
- 南阳市第五完全学校小学部开展“杏林传承”研学活动 每日看点
- Canalys:三星智能手机Q1市占率22% 超越苹果(AAPL.US)重回榜首
- 国家发改委:坚决遏制铁矿石价格的不合理上涨 促进铁矿石市场平稳运行_百事通
- 新一轮"甜蜜烦恼"将至 市政园林局抑花控果帮芒果节育_每日视点
- 蓬溪:特色产业撑起县域经济“脊梁”
- 今日看点:德讯午评:多方力量正在增强 近期或现普涨行情
- 世界快看:国家发展改革委:正起草恢复和扩大消费的政策 将下大力气稳定汽车消费
- 男子高速向窗外扔烟头被风吹回 惊慌追尾大货车 科普:相当危险 环球今热点
- 重庆黔江区法院、石柱县法院开展鱼苗增殖放流活动
- 聚焦绿色低碳 差异化功能纤维成开发重点
- 黄山红方印多少钱一包849 黄山红方印多少钱一包|每日速看
- 自己包的粽子煮多长时间能煮熟_粽子煮多久能煮熟
- 全球新消息丨南极归来!西北大学两名南极科考队员圆满完成科考任务
- 农业农村部:2023年第15周生猪及猪肉价格环比下降
- 国内什么快递可以邮寄到国外_什么快递可以寄到国外 全球新消息
- 中控技术:4月18日融券净卖出9326股,连续3日累计净卖出65.78万股
- 杭州公开一批色狼行政处罚结果-世界今头条
- 电影《我是刑警王》预告片发布 警匪大片还原真实刑警工作|全球今热点
- 时讯:英国央行或继续加息对抗高通胀
- 【环球新视野】观察 | 用数据解读德施曼智能门锁新品矩阵和高端产品走向
- 报道:华泰柏瑞基金管理有限公司关于增加蚂蚁(杭州)基金销售有限公司为旗下部分基金代销机构同时开通基金转换、定投业务的通知
- 上海生物医药产业规模今年目标超9000亿元
- 当前热议!埃及总统塞西:在苏丹的埃及军队旨在参加训练 不支持任何一方
- 天天微头条丨关于春天的图片简单 关于春天的图片
- 耒阳:机械插秧忙 沃野披绿装|天天快讯
- 每日热讯!三星4521一体机怎么调打印清晰度_三星4521一体机
- 世界快看点丨中卫市气象台发布大风黄色预警信号
- 交流合作“走进来” ,美丽健康“走出去”!美丽考察团走进昌平—— 天天滚动
- 环球热消息:中科星图2022年营收同比增长51.62% 数字地球龙头加速腾飞
- 山西新明医院管理有限公司 天天热议
- 宝宝缺锌怎么补最有效_宝宝缺锌怎么补比较快|全球快播
- 快看:再见李春江!再见李楠!篮协重罚殃及王哲林,上海男篮核心麻烦了
- 雷军官宣:张颂文为小米影像探索家!
- 环球热推荐:招股书项目写错正负号致净利润重大差错,迈百瑞收深交所监管函
- 一季度CPI涨幅回落 价格带动逐步增强 每日聚焦
- 最新消息:全球连线 | 中企承建的伊拉克示范学校项目助力当地教育发展
- 世界热点!官宣!直播吧获中甲联赛版权!将为吧友带来免费直播!
- 英经济学家:英国央行错误地将通胀归咎于俄乌冲突,导致经济陷入衰退
- 环球新消息丨辞职工资未结清违法吗
- 北京:今年打造5条左右“深夜食堂”特色餐饮街区,引进知名美食品牌
- 最高检:加大对集成电路、人工智能等重点领域核心技术司法保护力度 环球今日讯
- 女跳水运动员穿的泳衣叫什么_女跳水运动员穿的好露
- 天天视讯!百合股份:4月18日公司高管郑志海减持公司股份合计1.08万股
- 厦门暴雨系人工增雨?气象部门否认:本次为自然降水
广告
广告
- 如何验证翡翠的真假?只需要简单8步 天天短讯
- DJI RS 3 Mini发布:2千克负载仅795克,支持快速竖拍 天天新消息
- 形容法律威严的句子(精选187句)
- 《宝可梦》满血情况下受到的伤害减半,能带来多少对战机会?
- 世界热推荐:活力中国丨在忙碌的生产线感知中国经济活力
- 全球消息!海南航空回应男子在航班上喊飞机要出事:该名旅客已移交机场公安
- 陆金贷(小额应急)网贷逾期3年多久上征信|全球百事通
- 比亚迪继续减持比亚迪股份,半年已减持超30%
- 胎压监测板块1月9日涨0.91%,通达电气领涨,主力资金净流出2377.78万元_环球快消息
- 世界速看:陆金贷(小额应急)贷款逾期八天延迟还款会影响征信吗
- 記者觀察|封關壬寅末終落幕 港深雙城記開新篇 世界微动态
- 南开区16岁小孩抚养费一般多少钱
- 世界微头条丨十来万的车,我选卡罗拉
- 新华视点|商圈火、景区旺 各地消费市场显活力|聚焦
- 每日热门:光猫和路由器怎么连接 光猫和路由器的正确连接方法
- 蔬菜生吃还是熟吃?你是哪一派?|天天观点
- 天天消息!九典制药(300705.SZ):非洛地平片获批上市
- 热水泡脚脚痒是怎么回事?-环球时快讯
- 面试时,最可怕的就是背调?-世界视点
- 环球短讯![快讯]广联航空:关于特定股东减持数量过半的进展