问题描述:
使用数据库脚本创建表的时候,报这个错:
Invalid default value for 'create_time'
而我的对应sql语句时这样的:
`create_time` timestamp(0) DEFAULT NULL COMMENT '创建时间'
到网上查了资料,有这样一段话
mysql5.6.6之前,timestamp时间类型有一个默认行为:
TIMESTAMP列如果没有明确声明NULL属性,默认为NOT NULL。(而其他数据类型,如果没有显示声明为NOT NULL,则允许NULL值。)
insert插入一条数据,TIMESTAMP的列值为NULL,会自动存储时候,会将当前timestamp存储到这个timestamp列中。
这个描述告诉我们的问题很明白:
创建timestamp类型的字段时,不允许为空,如果非要为空,需要更改mysql配置,这个关键配置叫做 explicit_defaults_for_timestamp
我查了一下我的mysql关于这个配置,结果如下:
mysql> show variables like 'explicit_defaults_for_timestamp';
+---------------------------------+-------+
| Variable_name | Value |
+---------------------------------+-------+
| explicit_defaults_for_timestamp | OFF |
+---------------------------------+-------+
1 row in set (0.03 sec)
- 如果你不修改mysql语句,那我们把配置修改为explicit_defaults_for_timestamp = ON即可,关于这一块的修改方式,可以通过命令方式
mysql> set @@global.explicit_defaults_for_timestamp=on; -- 把全局的设置为on 那么新的连接就会被设置成on
Query OK, 0 rows affected (0.00 sec)
mysql> set @@session.explicit_defaults_for_timestamp=on; -- 把当前连接explicit_defaults_for_timestamp设置为on
Query OK, 0 rows affected (0.00 sec)
但是命令行方式,在重启mysql的情况下会失效,所以建议在msyql的配置文件my.cnf里修改之后重启mysql即可。
- 不过一般默认为ON的情况下,我们则需要老老实实按照系统的建议,将create_time的默认值配置上即可,这个也是我推荐的方式,因为创建时间和修改时间的字段,按照规范最好配置上默认值,修改后sql语句如下:
`create_time` timestamp(0) DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`update_time` timestamp(0) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新时间',
done! 问题解决
网友评论