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