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

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

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

create table test(

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

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

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

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

create table test2(

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

显然在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,那么这个需求就是可以完美支持的。