ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

2021-10-25 19:30:11  阅读:287  来源: 互联网

标签:off TIMESTAMP bill modify UPDATE 更新 CURRENT time ware


问题背景

需求背景

需求:对商品的上架与下架进行管控,下架的商品不能进行销售

上架与下架的管控,在我负责的项目(单据系统)中实现;销售的控制则是在另外一个项目(POS系统)中实现的

POS 系统定时地从单据系统中拉取数据,并对商品的销售进行控制

单据系统设计了两张表:

记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

实际上,表的字段不止这么多,但因为表的字段的多少不影响问题的出现,所以也就简化了表结构

下游系统根据 modify_time 定时进行数据的增量同步( t_ware_on_off_bill 和 t_ware_on_off_bill_detail 都会进行更新)

部分数据未同步

结果出现了部分数据未同步的情况

先来复现下问题,初始数据如下

记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

此时的 modify_time 的值是 2021-09-08 21:18:52.602

我们来执行下更新操作

记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

可以看到对 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 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

菜不可怕,怕的是我们不敢面对它;有问题,我们就去找原因,然后解决它(菜的好理直气壮...)

追查原因

其实 MySQL 官方文档中有说明:11.2.6 Automatic Initialization and Updating for TIMESTAMP and DATETIME

记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

两种情况会进行自动更新成系统当前时间

1、insert 行时,该列没有值

2、该行的任意列的值改变了

此时,相信大家都知道原因了吧

记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

虽然这个 SQL 很长,SET 了好几个字段,但是不满足上述两点中的任意一点,那么 modify_time 也就不会更新成系统当前时间了

解决问题

原因是找到了,如何解决问题了?

官方文档里面也说明了,显示的设值,也就是我们显示的指定 modify_time 的值,像这样

记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

我们来看看实际结果

记一次线上问题 → 对 MySQL 的 ON UPDATE CURRENT_TIMESTAMP 的片面认知

当然,解决方案不止这一种,各位可以在评论区畅所欲言

总结

1、MySQL 自动设置成系统当前时间是有条件的,否则是不会更新的哦

insert 行时,该列没有值

该行的任意列的值改变了

2、给大家留个疑问:为什么要有任意列的值改变了,MySQL 才会自动更新 modify_time 成当前系统时间,而不是只要有 SET 就更新 modify_time 成当前系统时间

 

标签:off,TIMESTAMP,bill,modify,UPDATE,更新,CURRENT,time,ware
来源: https://blog.csdn.net/m0_63213253/article/details/120958385

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有