MySQL的TIMESTAMP类型的默认值设置无效。
0 使用环境描述
Linux CentOS 7.8.2003
x86/64bit
MySQL: 5.7.24 (mysql --version / select version())
1 分析
ERROR 1067 (42000) at line 702: Invalid default value for 'CREATE_TIME' :对TIMESTAMP 类型的子段如果不设置缺省值或没有标志not null时候在创建表时会报这个错误
sql_mode中的NO_ZEROR_DATE导致的,在strict mode中不允许'0000-00-00'作为合法日期
2 解决过程
step0 查看sql_mode
mysql> show variables like 'sql_mode';
(或 select @@sql_mode)
+---------------+----------------------------------------------------------------------------------------------------------------------------------
| Variable_name | Value |
+---------------+----------------------------------------------------------------------------------------------------------------------------------
| sql_mode | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+----------------------------------------------------------------------------------------------------------------------------------
step1 重置mysql的sql_mode
思路: 将上面的【NO_ZERO_DATE】改为下面的 【ALLOW_INVALID_DATES】
- 方式1: my.cnf(永久性配置)
cmd: cd /etc/my.cnf
my.cnf: sql_mode=ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ALLOW_INVALID_DATES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
- 方式2: 临时性
退出当前会话后,又将自动恢复为NO_ZERO_DATE
set sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ALLOW_INVALID_DATES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'
step2 重启MySQL服务
务必重启,方能保证配置生效。
[root@xufeng ~]# service mysqld restart (或 systemctl restart mysqld[.service])
Redirecting to /bin/systemctl restart mysqld.service