mysql建表报错

问题描述:
使用数据库脚本创建表的时候,报这个错:
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! 问题解决

你可能感兴趣的:(mysql建表报错)