MySQL多版本的时间类型问题

那年仲夏 提交于 2021-02-17 13:57:16

 这是学习笔记的第 1758篇文章


今天在处理一个业务的时候,碰到开发同学提交的一个需求。他在线上环境(MySQL5.5)中提交了一条SQL,期望创建几张表,但是抛出了错误。

其中一张表的建表SQL类似于:

create table test(

xxxxx,

`create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

);

根据MySQL 5.5的特性,datetime还支持不了动态默认值。

所以他们斟酌再三,决定改写为timestamp类型。

我看到另外一张表的建表SQL:

create table test2(

xxxxx,

  `create_time` timestamp DEFAULT NULL COMMENT '创建时间',

xxxx

);

显然在MySQL 5.5里面,timestamp类型是不支持default null的这种方式的。

在这一点上不存在额外的特性,就是timestamp的一个限制,在5.5,5.7都不支持default null。

哪怕我们改下需求,支持基于timestamp类型的动态默认值,下面的SQL也会抛出问题。 

CREATE TABLE `qc_apeal` (

  `id` int(11) NOT NULL AUTO_INCREMENT COMMENT '自增id',

  。。。

  `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

  `modify_time` timestamp DEFAULT current_timestamp  COMMENT '修改时间',

 。。。

) ;

ERROR 1293 (HY000): Incorrect table definition; there can be only one TIMESTAMP column with CURRENT_TIMESTAMP in DEFAULT or ON UPDATE clause

可以很清晰的看到,timestamp可以支持动态默认值,但是不支持一个表中存在两个这样的字段设置。


和开发同学聊了下,感觉需求和MySQL支持的情况有些纠结。 

开发同学的需求是:

1)时间类型,统一成一种类型;

2)有些字段允许默认为当前时间;有些字段默认为空;

而按照目前能够支持的情况,因为是基于版本5.5,所以简单的总结如下:

1).datetime 在5.5版本不支持动态默认值,但是支持default null这种方式。

2).timestamp可以支持动态默认值,但是范围要窄一些。

3).如果对timestamp设置动态默认值,表里只能有一个timestamp字段

4).timestamp不支持default null的语法,5.5,5.7都不支持

所以在这种情况下,暂时没有更好的解决方案了,如果在应用端能够保证时间字段的值,那么这个问题就简单多了。 

或者说,情况允许的话,可以把MySQL 5.5升级到MySQL 5.7,那么这个需求就是可以完美支持的。 


本文分享自微信公众号 - 杨建荣的学习笔记(jianrong-notes)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!