在使用MySQL中datetime格式自動更新特性時,我們應該明確一點,datetime格式設置默認值為當前時間和自動更新時間是從MySQL5.6版本之后開始支持的。此前我們都是使用timestamp格式來實現自動更新時間。
一、下面是datetime與timestamp兩者的簡單對比
格式 | 時間范圍 | 時間處理 | 默認值和自動更新 |
datetime | '1000-01-01 00:00:00'~'9999-12-31 23:59:59' | - | 高版本支持 |
timestamp | '1970-01-01 00:00:01'UTC~'2038-01-19 03:14:07'UTC | 從當前時區轉換為UTC存儲,並從UTC轉回當前時區以供檢索 | 支持 |
二、總結一下區別,主要是:
- datetime的默認值為null,timestamp的默認值不為null,且為系統當前時間(current_timestatmp)。如果不做特殊處理,且update沒有指定該列更新,則默認更新為當前時間。
- datetime占用8個字節,timestamp占用4個字節。timestamp利用率更高。
- 二者存儲方式不一樣,對於timestamp,在存儲時從當前時區轉換為UTC存儲,檢索時從UTC轉回當前時區以供檢索。但對於datetime,基本上存什么是什么。
- 二者范圍不一樣。timestamp范圍:‘1970-01-01 00:00:01.000000’ 到 ‘2038-01-19 03:14:07.999999’;datetime范圍:’1000-01-01 00:00:00.000000’ 到 ‘9999-12-31 23:59:59.999999’。原因是,timestamp占用4字節,能表示最大的時間毫秒為2的31次方減1,也就是2147483647,換成時間剛好是2038-01-19 03:14:07.999999。
三、設置默認值和自動更新策略的方式:
DEFAULT關鍵字設置默認值;
ON UPDATE 關鍵字設置更新策略;兩者互相獨立。
-- 創建測試表 CREATE TABLE mytest ( `id` int(11) NOT NULL AUTO_INCREMENT, `username` varchar(50) DEFAULT NULL, `password` varchar(50) DEFAULT NULL, createTime DATETIME DEFAULT CURRENT_TIMESTAMP , updateTime DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, PRIMARY KEY (`id`) );
如果是更新已有字段使用如下語句
alter table tableName modify column createTime DATETIME DEFAULT CURRENT_TIMESTAMP; alter table tableName modify column updateTime DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
測試
-- 檢測默認值,插入測試數據 -- 可以看到插入數據自動給createTime設置的默認時間的當前時間,updateTime為最后一次更新的時間 INSERT into mytest(`username`,`password`) VALUES ("root","root");
-- 檢測自動更新,更新某條數據 -- 當修改數據時,updateTime自動更新為當前時間 update mytest set username = "admin" where id = 1;