数据库使用的是 MySQL。

引擎启动的时候会自动进行建表。创建表的时候,日志出现错误信息 1067 - Invliad default vlalue for update_date

问题排查

使用数据库客户端连接数据库,查询数据库 sql_mode

select @@sql_mode

查询结果中包含 NO_ZERO_IN_DATE、NO_ZERO_DATE

STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION

查询变量

show variables like 'explicit_defaults_for_timestamp';

查询结果如下 value 为 OFF

explicit_defaults_for_timestamp OFF

问题简单描述

由于 sql_mode 含有 NO_ZERO_IN_DATE、NO_ZERO_DATE,就是日期和时间类型的字段,不能包含零时间,例如'0000-00-00 00:00:00'

explicit_defaults_for_timestamp 为 OFF,会导致建表语句中,如果有多个 timestamp 字段,并且没有显式地指定为 NULL 或者默认值。MySQL 就会自动给第一个字段之后的字段,加上 DEFAULT '0000-00-00 00:00:0',这跟 NO_ZERO_DATE 是违背的,就会提示最开始的错误。

例如以下建表语句,在 explicit_defaults_for_timestamp 为 OFF 时报错。

CREATE TABLE test(
   x int(11) NOT NULL AUTO_INCREMENT,
   y timestamp,
   z timestamp,
   w timestamp,
   PRIMARY KEY (x)
) ENGINE=InnoDB;

注意:从 MySQL 8.0.2 开始,explicit_defaults_for_timestamp 默认为 ON。现在部署脚本,安装的 MySQL 版本是 8.0.0。

解决方案

修改 explicit_defaults_for_timestamp 为 ON

在 Linux 系统上,MySQL 的配置文件通常位于 /etc/my.cnf 或 /etc/mysql/my.cnf;在 Windows 系统上,通常位于 C:\Program Files\MySQL\MySQL Server X.X\my.ini。

找到配置文件后,使用文本编辑器打开,并找到 [mysqld] 部分。在该部分添加或修改以下行:

explicit_defaults_for_timestamp = ON

参考资料

  1. https://cloud.baidu.com/doc/RDS/s/Ejy5gwvug

  2. https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_explicit_defaults_for_timestamp