MYSQL timestamp NOT NULL插入NULL的報錯問題

lonecloud發表於2018-09-30

1. 在開發兩個資料庫資料同步功能的時候,需要在本地搭建一個本地的資料庫作為一個本地庫,然後用於同步開發庫中的資料。在插入的時候出現了一個問題。

問題描述:

    我們每張表中都會存在一個create_time 以及update_time兩個欄位。該兩個欄位的定義如下:

  `create_date` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '建立日期',
  `update_date` timestamp(0) NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(0) COMMENT '更新時間',

  其中建立時間採用timestamp型別並且其預設值為CURRENT_TIMESTAMP。

    當我向資料庫中插入一條資料的時候,create_time與Update_time設定為null的時候,開發庫中會走預設值,但是本地庫並不會,並且報錯“create_time” cannot be null

問題解決:

查詢google後發現

MySql系統變數explicit_defaults_for_timestamp: 該變數的作用為:

檢視了一下解釋

大概是這麼說的:

當你設定為false的時候:

  • 未明確宣告為NULL屬性的TIMESTAMP列被分配為NOT NULL屬性。 (其他資料型別的列,如果未顯式宣告為NOT NULL,則允許NULL值。)將此列設定為NULL將其設定為當前時間戳。
  • 表中的第一個TIMESTAMP列(如果未宣告為NULL屬性或顯式DEFAULT或ON UPDATE子句)將自動分配DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP屬性。
  • 第一個之後的TIMESTAMP列(如果未宣告為NULL屬性或顯式DEFAULT子句)將自動分配DEFAULT'0000-00-00 00:00:00'(“零”時間戳)。 對於不指定此列的顯式值的插入行,該列將分配“0000-00-00 00:00:00”,並且不會發生警告。

當你設定為true的時候:

  • 未明確宣告為NOT NULL的TIMESTAMP列允許NULL值。 將此列設定為NULL將其設定為NULL,而不是當前時間戳。
  • 沒有TIMESTAMP列自動分配DEFAULT CURRENT_TIMESTAMP或ON UPDATE CURRENT_TIMESTAMP屬性。 必須明確指定這些屬性。
  • 宣告為NOT NULL且沒有顯式DEFAULT子句的TIMESTAMP列被視為沒有預設值。 對於不為此列指定顯式值的插入行,結果取決於SQL模式。 如果啟用了嚴格的SQL模式,則會發生錯誤。 如果未啟用嚴格的SQL模式,則會為列分配隱式預設值“0000-00-00 00:00:00”,併發出警告。 這類似於MySQL如何處理其他時間型別,如DATETIME。

檢視我的本地庫,發現我的my.cnf檔案上居然加上了一個這麼個玩意:

[client]
port=3306
default-character-set=utf8

[mysqld]
#解壓目錄
basedir=D:\MYSQL\
#解壓目錄下data目錄
datadir=D:\MYSQL\data
port=3306
character_set_server=utf8
#匯出mysql資料的目錄
secure_file_priv = D:\MYSQL\data
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
#開啟查詢快取
explicit_defaults_for_timestamp=true
skip-grant-tables

[WinMySQLAdmin]
D:\MYSQL\mysqld.exe

  

後悔後悔,沒有好好看配置啊。直接copy。。。。

 

問題總結:
  1. timestamp如果想設定為not null,則必須要設定預設值。建議設定為當前時間即可

       2. explicit_defaults_for_timestamp 這個引數已經在5.6版本已經棄用了,不建議採用該配置了

       3. 好好看配置檔案,不要亂copy

 

相關文章