记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知
问题背景
需求背景
需求:对商品的上架与下架进行管控,下架的商品不能进行销售
上架与下架的管控,在我负责的项目(单据系统)中实现;销售的控制则是在另外一个项目(POS系统)中实现的
POS 系统定时地从单据系统中拉取数据,并对商品的销售进行控制
单据系统设计了两张表:
实际上,表的字段不止这么多,但因为表的字段的多少不影响问题的出现,所以也就简化了表结构
下游系统根据 modify_time 定时进行数据的增量同步( t_ware_on_off_bill 和 t_ware_on_off_bill_detail 都会进行更新)
部分数据未同步
结果出现了部分数据未同步的情况
先来复现下问题,初始数据如下
此时的 modify_time 的值是 2021-09-08 21:18:52.602
我们来执行下更新操作
可以看到对 t_ware_on_off_bill 的更新结果是: 受影响的行: 0 , modify_time 并未进行更新,其值仍是 2021-09-08 21:18:52.602
但是 t_ware_on_off_bill_detail 是实实在在存在更新的
这就导致下游系统通过 modify_time 没有增量同步最新的商品明细
问题来了:明明对 t_ware_on_off_bill 的 N 个字段进行了 SET 操作,为什么没有记录受影响(modify_time 为什么不更新)
探究真相
我相信此时很多小伙伴都认为楼主是这个
菜不可怕,怕的是我们不敢面对它;有问题,我们就去找原因,然后解决它(菜的好理直气壮...)
追查原因
其实 MySQL 官方文档中有说明:11.2.6 Automatic Initialization and Updating for TIMESTAMP and DATETIME
两种情况会进行自动更新成系统当前时间
1、insert 行时,该列没有值
2、该行的任意列的值改变了
此时,相信大家都知道原因了吧
虽然这个 SQL 很长,SET 了好几个字段,但是不满足上述两点中的任意一点,那么 modify_time 也就不会更新成系统当前时间了
解决问题
原因是找到了,如何解决问题了?
官方文档里面也说明了,显示的设值,也就是我们显示的指定 modify_time 的值,像这样
我们来看看实际结果
当然,解决方案不止这一种,各位可以在评论区畅所欲言
总结
1、MySQL 自动设置成系统当前时间是有条件的,否则是不会更新的哦
insert 行时,该列没有值
该行的任意列的值改变了
2、给大家留个疑问:为什么要有任意列的值改变了,MySQL 才会自动更新 modify_time 成当前系统时间,而不是只要有 SET 就更新 modify_time 成当前系统时间
相关文章
- [javascript] elementui下login登录页界面和js验证逻辑
- [javascript] vuejs的elementui配合iframe实现页面跳转
- [Go] 使用字面值方式初始化map
- [javascript] 基于elementui的后台界面开发
- [PHP] 算法-数组归并排序并计算逆序对的个数的PHP实现
- [PHP] 算法-原址排序数组使奇数位于偶数前面的PHP实现
- [MySQL] 索引优化不只是用于面试
- 带你全面的了解二叉树
- VEGA:诺亚AutoML高性能开源算法集简介
- CANN 5.0硬核技术抢先看
- M-SQL:超强的多任务表示学习方法
- 带你掌握Vue过滤器filters及时间戳转换
- 基于Tensorflow + Opencv 实现CNN自定义图像分类
- Shell:Lite OS在线调试工具知多少
- 大力出奇迹,揭秘昇腾CANN的AI超能力
- 带你学会区分Scheduled Thread Pool Executor 与Timer
- CANN AICPU算子耗时分析及优化探索
- 解析鸿蒙内核消息队列QueueMail接口的哼哈二将
- 3年才能驾驭新技术,不如试试这个低代码魔方
- 计划会议要开始了,产品负责人却没来…