[ 案例分析 ] 数据库时间字段CURRENT_TIMESTAMP ON UPDATE导致时间错乱

一、问题描述
Mysql数据库CURRENT_TIMESTAMP时间字段在更新其他字段数据时发生变更(开始时间小于结束时间)

二、定位方法
1、判断项目部署服务器和数据库所在服务器是否是同一个服务器,如果不是,服务器间时间是否同步一致。观察数据库脚本中出问题的时间字段的属性设置有什么特点。
2、观察数据库脚本中出问题的时间字段的属性设置有什么特点。

三、问题代码[分析步骤]
1、以mysql 5.7版本数据库为例
[ 案例分析 ] 数据库时间字段CURRENT_TIMESTAMP ON UPDATE导致时间错乱
从上图可以看到,该表的第一个时间字段的默认值是CURRENT_TIMESTAMP,并且含有 ON UPDATE CURRENT_TIMESTAMP属性,变更一行数据测试效果如下:
[ 案例分析 ] 数据库时间字段CURRENT_TIMESTAMP ON UPDATE导致时间错乱
修改最后一个字段的值,保存后刷新:
[ 案例分析 ] 数据库时间字段CURRENT_TIMESTAMP ON UPDATE导致时间错乱
可以发现time_start的字段被更新了,该操作会导致更新数据的同时,将数据的开始时间大于结束时间,界面展示明显有问题。
2、同样的数据库脚本在mysql 5.1版本的数据库中也会发生,测试效果如下:
[ 案例分析 ] 数据库时间字段CURRENT_TIMESTAMP ON UPDATE导致时间错乱
[ 案例分析 ] 数据库时间字段CURRENT_TIMESTAMP ON UPDATE导致时间错乱
3、有所区别的是:
> 在5.1版本数据库中,CURRENT_TIMESTAMP只能设置一个,并且只有一个可以为ON UPDATE属性:
[ 案例分析 ] 数据库时间字段CURRENT_TIMESTAMP ON UPDATE导致时间错乱

[ 案例分析 ] 数据库时间字段CURRENT_TIMESTAMP ON UPDATE导致时间错乱
> 在5.7版本数据库中,CURRENT_TIMESTAMP可以设置多个,并且多个可以为ON UPDATE属性:

[ 案例分析 ] 数据库时间字段CURRENT_TIMESTAMP ON UPDATE导致时间错乱
且,记录发生更新时,含有ON UPDATE属性的时间字段都会发生更新

[ 案例分析 ] 数据库时间字段CURRENT_TIMESTAMP ON UPDATE导致时间错乱
[ 案例分析 ] 数据库时间字段CURRENT_TIMESTAMP ON UPDATE导致时间错乱

四、解决方案
1、针对服务器时间不同导致的该问题的出现,同步服务器时间即可
2、针对数据库版本升级导致的时间字段属性设置特性差异,需要将设置为CURRENT_TIMESTAMP的字段的ON UPDATE属性移除
> 高版本SQLyog中可以变更 ON UPDATE 属性
> sql语句变更:
ALTER TABLE T_PD_ALARM MODIFY time_end TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP COMMENT '告警结束时间'
将红色部分移除亦可剔除ON UPDATE属性
3、CURRENT_TIMESTAMP设置数目的特性变更在5.6以后发生
4、建议数据库中时间字段不要使用ON UPDATE属性[数据库设计]