Timestarmp列可以設置兩個屬性:1、DEFAULT CURRENT_TIMESTAMP 表示插入記錄行時,如果未對該列指定值,則使用當前時間來為該欄位賦值2、ON UPDATE CURRENT_TIMESTAMP 表示在更新記錄時,如果為更新該事件戳列,使用當前時間來更新該欄位 如果在定義時 ...
==============================================================================
DATETIME類型和TIMESTAMP類型的差別
DATETIME類型
DATETIME類型存放數據範圍從1001年到9999年,精度為秒,將時間和日期封裝成格式為YYYYMMDDHHmmss的整數中,使用8個位元組的存儲空間。
DATETIME類型不存放任何時區相關信息。
DATETIME類型預設為NULL
TIMESTAMP類型
TIMESTAMP類型保存從1970-01-01 00:00(格林尼治標準時間)以來的秒數。
TIMESTAMP精確到秒,使用4個位元組的存儲空間,存儲範圍從1970年到2038年。
TIMESTAMP列預設為NOT NULL
在MySQL中,可以使用函數UNIX_TIMESTAMP和FROM_UNIXTIME來進行整數秒和TIMESTAMP時間的轉換。
如:
SELECT UNIX_TIMESTAMP(NOW());
SELECT FROM_UNIXTIME(1468602420);
==============================================================================
Timestarmp列可以設置兩個屬性:
1、DEFAULT CURRENT_TIMESTAMP 表示插入記錄行時,如果未對該列指定值,則使用當前時間來為該欄位賦值
2、ON UPDATE CURRENT_TIMESTAMP 表示在更新記錄時,如果為更新該事件戳列,使用當前時間來更新該欄位
==============================================================================
如果在定義時間戳欄位時列定義為:c1 timestamp DEFAULT CURRENT_TIMESTAMP,那麼c1列僅在插入且未指定值時會被賦值為當前時間,在更新且未指定更新值時該時間戳列不會發生值變化。
CREATE TABLE tb1002(id int primary key,c1 timestamp DEFAULT CURRENT_TIMESTAMP); insert into tb1002(id) select 1 union select 2; update tb1002 set id=3 where id=1; select * from tb1002; +----+---------------------+ | id | c1 | +----+---------------------+ | 2 | 2016-07-29 23:53:51 | | 3 | 2016-07-29 23:53:51 | +----+---------------------+
從結果可以發現更新操作未更新時間戳列
==============================================================================
如果在定義時間戳欄位時列定義為:c1 timestamp ON UPDATE CURRENT_TIMESTAMP,那麼C1列僅在更新且未指定更新值時會被更新為當前時間,而在插入時如果未指明插入值則將該事件戳列賦值為‘0000-00-00 00:00:00’
CREATE TABLE tb1003(id int primary key,c1 timestamp ON UPDATE CURRENT_TIMESTAMP);
insert into tb1003(id) select 1;
select * from tb1003;
+----+---------------------+
| id | c1 |
+----+---------------------+
| 1 | 0000-00-00 00:00:00 |
+----+---------------------+
從結果可以發現插入時列未被賦值為當前時間而被賦值為'0000-00-00 00:00:00’。
==============================================================================
當時間戳欄位被設置預設值,如在定義時間戳欄位時列定義為:c1 timestamp default 0,,則不會為欄位增加預設NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP屬性
CREATE TABLE tb1004(id int primary key,c1 timestamp default 0);
查看建表語句變為:
CREATE TABLE `tb1004` (
`id` int(11) NOT NULL,
`c1` timestamp NOT NULL DEFAULT '0000-00-00 00:00:00',
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
insert into tb1004(id) select 1 union select 2;
update tb1004 set id=3 where id=1;
select * from tb1004;
+----+---------------------+
| id | c1 |
+----+---------------------+
| 2 | 0000-00-00 00:00:00 |
| 3 | 0000-00-00 00:00:00 |
+----+---------------------+
從結果可以發現,無論是插入還是更新,都沒有將時間戳欄位更新為當前時間,而是使用預設值!