您的位置:首页 > 数据库

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

2017-12-14 10:06 836 查看
一、问题描述

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

二、定位方法

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

2、观察数据库脚本中出问题的时间字段的属性设置有什么特点。

三、问题代码[分析步骤]

1、以mysql 5.7版本数据库为例



从上图可以看到,该表的第一个时间字段的默认值是CURRENT_TIMESTAMP,并且含有 ON UPDATE CURRENT_TIMESTAMP属性,变更一行数据测试效果如下:



修改最后一个字段的值,保存后刷新:



可以发现time_start的字段被更新了,该操作会导致更新数据的同时,将数据的开始时间大于结束时间,界面展示明显有问题。

2、同样的数据库脚本在mysql 5.1版本的数据库中也会发生,测试效果如下:





3、有所区别的是:

> 在5.1版本数据库中,CURRENT_TIMESTAMP只能设置一个,并且只有一个可以为ON UPDATE属性:





> 在5.7版本数据库中,CURRENT_TIMESTAMP可以设置多个,并且多个可以为ON UPDATE属性:



且,记录发生更新时,含有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属性[数据库设计]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐