在MySQL 5.6版本中引入參數explicit_defaults_for_timestamp設置,該參數會影響Timestamp的預設屬性。 同時在MySQL 5.6版本中中,去除一張表只能有一個TIMESTAMP列的限制,允許單表中使用多個時間戳列。 在MySQL 5.6中,當參數explic ...
在MySQL 5.6版本中引入參數explicit_defaults_for_timestamp設置,該參數會影響Timestamp的預設屬性。
同時在MySQL 5.6版本中中,去除一張表只能有一個TIMESTAMP列的限制,允許單表中使用多個時間戳列。
===============================================================================
在MySQL 5.6中,當參數explicit_defaults_for_timestamp=OFF時:
1、TIMESTAMP列如果沒有明確指定為NLL,則預設為NOT NULL
2、TIMESTAMP列如果明確指定為NULL,則會增加預設值NULL
3、表中第一個TIMESTAMP列,如果沒有聲明為NULL屬性、DEFAULT或者 ON UPDATE,會自動分配 DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP 屬性。
4、表中第二個TIMESTAMP列,如果沒有聲明為NULL或者DEFAULT子句,預設自動分配’0000-00-00 00:00:00′。插入行時沒有指明改列的值,該列預設分配’0000-00-00 00:00:00′,且沒有警告。
如使用下麵腳本創建:
CREATE TABLE tb2004(
id INT PRIMARY KEY,
c1 TIMESTAMP,
c2 TIMESTAMP,
c3 TIMESTAMP);
然後SHOW CREATE TABLE tb2004會發現創建腳本為:
CREATE TABLE `tb2004` (
`id` int(11) NOT NULL,
`c1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
`c2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
`c3` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
===============================================================================
在MySQL 5.6中,當參數explicit_defaults_for_timestamp=ON時:
1、TIMESTAMP列如果沒有明確指定為NOT NLL則預設為NULL
2、表中TIMESTAMP列聲明為NOT NULL時,則不會為列自動創建預設值,且該列不能顯式插入NULL值。
3、表中第一個TIMESTAMP列不會自動分配 DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP 屬性,需要顯式聲明。
4、表中第二各TIMESTAMP列與第一個TIMESTAMP列不會存在特殊設置。
如使用下麵腳本創建:
CREATE TABLE tb2004(
id INT PRIMARY KEY,
c1 TIMESTAMP,
c2 TIMESTAMP,
c3 TIMESTAMP);
然後SHOW CREATE TABLE tb2004會發現創建腳本為:
CREATE TABLE `tb2004` (
`id` int(11) NOT NULL,
`c1` timestamp NULL DEFAULT NULL,
`c2` timestamp NULL DEFAULT NULL,
`c3` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
而如使用下麵腳本創建:
CREATE TABLE tb2005(
id INT PRIMARY KEY,
c1 TIMESTAMP NOT NULL,
c2 TIMESTAMP NOT NULL,
c3 TIMESTAMP NOT NULL);
然後SHOW CREATE TABLE tb2005會發現創建腳本為:
CREATE TABLE `tb2005` (
`id` int(11) NOT NULL,
`c1` timestamp NOT NULL,
`c2` timestamp NOT NULL,
`c3` timestamp NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
=================================================================
在MySQL5.7.8及之後版本中,參數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
其中NO_ZERO_IN_DATE和NO_ZERO_DATE會嚴格限制時間欄位和時間戳欄位的值:
NO_ZERO_IN_DATE:要求年月日都為0或月日不為0
NO_ZERO_DATE:要求年月日中任一項不為0
當sql_mode中同時包含NO_ZERO_IN_DATE和NO_ZERO_DATE時,則不允許向時間欄位和時間戳欄位插入任何非法日期的值,即不允許插入'0000-00-00 00:00:00'的值。
=================================================================
總結和建議:
1、為避免受參數explicit_defaults_for_timestamp的影響,在建表時建議寫全timestamp的所有屬性。
2、時間戳欄位主要用於記錄行被插入或更新的時間,應避免向時間戳列顯示插入NULL值或異常時間值。
=================================================================