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