TIMESTAMP 与 explicit_defaults_for_timestamp
生活随笔
收集整理的這篇文章主要介紹了
TIMESTAMP 与 explicit_defaults_for_timestamp
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
在MySQL 5.6.6之前,TIMESTAMP的默認(rèn)行為:
- TIMESTAMP列如果沒(méi)有明確聲明NULL屬性,默認(rèn)為NOT NULL。(而其他數(shù)據(jù)類型,如果沒(méi)有顯示聲明為NOT NULL,則允許NULL值。)設(shè)置TIMESTAMP的列值為NULL,會(huì)自動(dòng)存儲(chǔ)為當(dāng)前timestamp。
- 表中的第一個(gè)TIMESTAMP列,如果沒(méi)有聲明NULL屬性、DEFAULT或者 ON UPDATE,會(huì)自動(dòng)分配 DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP 屬性。
- 表中第二個(gè)TIMESTAMP列,如果沒(méi)有聲明為NULL或者DEFAULT子句,默認(rèn)自動(dòng)分配’0000-00-00 00:00:00′。插入行時(shí)沒(méi)有指明改列的值,該列默認(rèn)分配’0000-00-00 00:00:00′,且沒(méi)有警告。
CREATE TABLE `timestamp` (`id` int(11) NOT NULL AUTO_INCREMENT, `time1` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,`time2` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
2列TIMESTAMP未聲明為NULL的默認(rèn)行為 timestamp有兩個(gè)屬性,分別是CURRENT_TIMESTAMP 和ON UPDATE CURRENT_TIMESTAMP兩種,使用情況分別如下:1. CURRENT_TIMESTAMP 當(dāng)要向數(shù)據(jù)庫(kù)執(zhí)行insert操作時(shí),如果有個(gè)timestamp字段屬性設(shè)為 CURRENT_TIMESTAMP,則無(wú)論這個(gè)字段有沒(méi)有set值都插入當(dāng)前系統(tǒng)時(shí)間 2. ON UPDATE CURRENT_TIMESTAMP當(dāng)執(zhí)行update操作時(shí),并且字段有ON UPDATE CURRENT_TIMESTAMP屬性。則字段無(wú)論值有沒(méi)有變化,它的值也會(huì)跟著更新為當(dāng)前UPDATE操作時(shí)的時(shí)間。
?
從MySQL5.6.6開(kāi)始這種默認(rèn)設(shè)置的方法被廢棄了。在MySQL啟動(dòng)時(shí)會(huì)出現(xiàn)以下警告:
| 1 2 3 | [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (seedocumentation for more details). |
關(guān)閉警告,在my.cnf中加入
| 1 2 | [mysqld] explicit_defaults_for_timestamp=true |
重啟MySQL后錯(cuò)誤消失,這時(shí)TIMESTAMP的行為如下:
- TIMESTAMP如果沒(méi)有顯示聲明NOT NULL,是允許NULL值的,可以直接設(shè)置改列為NULL,而沒(méi)有默認(rèn)填充行為。
- TIMESTAMP不會(huì)默認(rèn)分配DEFAULT CURRENT_TIMESTAMP 和 ON UPDATE CURRENT_TIMESTAMP屬性。
?
?
mysql> set sql_mode="STRICT_TRANS_TABLES"; Query OK, 0 rows affected (0.00 sec)mysql> create table timestamp4(id int not null auto_increment,time1 timestamp not null,time2 timestamp not null,primary key(id))engine=innodb; Query OK, 0 rows affected (0.03 sec) mysql> insert into timestamp4 select 1,"0000-00-00 00:00:00","0000-00-00 00:00:00"; Query OK, 1 row affected (0.17 sec) Records: 1 Duplicates: 0 Warnings: 0mysql> insert into timestamp4 select 1,"0000-00-00 00:00:00","5"; ERROR 1292 (22007): Incorrect datetime value: '5' for column 'time2' at row 1mysql> set sql_mode="STRICT_TRANS_TABLES,NO_ZERO_DATE"; Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> insert into timestamp4 select 1,"0000-00-00 00:00:00","0000-00-00 00:00:00"; ERROR 1292 (22007): Incorrect datetime value: '0000-00-00 00:00:00' for column 'time1' at row 1 mysql> set sql_mode="STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE"; Query OK, 0 rows affected, 2 warnings (0.00 sec) mysql> insert into timestamp4 select 5,"2000-10-10 10:20:10","2000-10-10 10:20:00"; Query OK, 1 row affected (0.18 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> insert into timestamp4 select 7,"2000-10-00 10:20:10","2000-10-10 10:20:11"; 日期中不能有00 ERROR 1292 (22007): Incorrect datetime value: '2000-10-00 10:20:10' for column 'time1' at row 1
?
?
?
mysql> create table y( a int not null auto_increment primary key,b timestamp Default CURRENT_TIMESTAMP);當(dāng)有記錄插入時(shí),把當(dāng)前日期與時(shí)間寫入到 b字段中,但更新不會(huì)改變值 mysql> create table y1( a int not null auto_increment primary key,b timestamp on update CURRENT_TIMESTAMP);
當(dāng)有記錄插入時(shí),NULL寫入到B 字段中,當(dāng)該行update時(shí),b列值為當(dāng)前更新時(shí)間值 mysql> create table y2( a int not null auto_increment primary key,b timestamp default current_timestamp on update CURRENT_TIMESTAMP); 當(dāng)插入時(shí),有一個(gè)默認(rèn)值,隨著當(dāng)前行的更新,b列值也隨著更新為當(dāng)前更新時(shí)間mysql> insert into y(a) values(null); Query OK, 1 row affected (0.17 sec)mysql> insert into y1(a) values(null); Query OK, 1 row affected (0.17 sec)mysql> insert into y2(a) values(null); Query OK, 1 row affected (0.17 sec)mysql> select * from y; +---+---------------------+ | a | b | +---+---------------------+ | 1 | 2016-07-02 18:56:59 | +---+---------------------+ 1 row in set (0.00 sec)mysql> select * from y1; +---+------+ | a | b | +---+------+ | 1 | NULL | +---+------+ 1 row in set (0.00 sec) mysql> select * from y2; +---+---------------------+ | a | b | +---+---------------------+ | 1 | 2016-07-02 18:57:08 | +---+---------------------+ 1 row in set (0.00 sec)
mysql> update y set a=2 where a=1; Query OK, 1 row affected (0.20 sec) Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from y; +---+---------------------+ | a | b | +---+---------------------+ | 2 | 2016-07-02 18:56:59 | +---+---------------------+ 1 row in set (0.01 sec)mysql> update y1 set a=2 where a=1; Query OK, 1 row affected (0.17 sec) Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from y1; +---+---------------------+ | a | b | +---+---------------------+ | 2 | 2016-07-02 19:00:12 | +---+---------------------+ 1 row in set (0.00 sec)mysql> update y2 set a=2 where a=1; Query OK, 1 row affected (0.01 sec) Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from y2; +---+---------------------+ | a | b | +---+---------------------+ | 2 | 2016-07-02 19:00:35 | +---+---------------------+ 1 row in set (0.00 sec) 設(shè)置正常日期格式:
嚴(yán)格日期格式:
set sql_mode="STRICT_TRANS_TABLES,NO_ZERO_DATE,NO_ZERO_IN_DATE"; 手動(dòng)指定默認(rèn)值:
create table y2( a int not null auto_increment primary key,b timestamp default current_timestamp on update CURRENT_TIMESTAMP);
?
轉(zhuǎn)載于:https://www.cnblogs.com/zengkefu/p/5636593.html
總結(jié)
以上是生活随笔為你收集整理的TIMESTAMP 与 explicit_defaults_for_timestamp的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 修改hostname
- 下一篇: C语言一维数组、二维数组、结构体的初始化