解決:mysql5.7 timestamp默認值0000-00-00 00:00:00 報錯


一. 問題的引出

我們在用mysql5.7創建表時,如果把timestamp(時間戳)的默認值設置為0000-00-00 00:00:00 的形式,將會產生一條報錯:

  `RepaymentDate` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' COMMENT '回款日期',

報錯信息如下:

[Err] 1067 - Invalid default value for 'RepaymentDate'

二. 找出原因

這個問題和mysql中sql_mode有關系,我們可以采用兩種方法來查看它的值

方法一

mysql> show variables like '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_ENGIN
E_SUBSTITUTION |
+---------------+-----------------------------------------------------------------------------------------------
---------------+
1 row in set, 1 warning (0.01 sec)

方法二

mysql> select @@sql_mode;
+--------------------------------------------------------------------------------------------------------------+

| @@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 | +--------------------------------------------------------------------------------------------------------------+ 1 row in set (0.00 sec)

我們可以看到,默認會有:NO_ZERO_IN_DATE 和 NO_ZERO_DATE 兩個值,限制字段不能為零日期

三. 問題的解決

網上有兩種方法來解決這個問題

一種是修改配置文件

mysql5.7 版本中 timestamp 不能為零日期 以及sql_mode合理設置

Mysql 數據庫date, datetime類型設置0000-00-00默認值報錯問題

然而不知為何,修改配置文件,卻不能成功

第二種是執行命令

MySQL中Invalid default value for '0000-00-00 00:00:00'問題

mysql> set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

set session sql_mode,僅對當前的會話有效,然后直接把sql語句拷貝到mysql>下,回車,表就可以創建成功


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM