MySQL目前不支持列的Default 為函數的形式
如達到你某列的默認值為當前更新日期與時間的功能
你可以使用TIMESTAMP列類型
下面就詳細說明TIMESTAMP列類型
TIMESTAMP列類型 TIMESTAMP值可以從
的某時的開始一直到
年
精度為一秒
其值作為數字顯示
TIMESTAMP值顯示尺寸的格式如下表所示
+
+
+
| 列類型 | 顯示格式 |
| TIMESTAMP(
) | YYYYMMDDHHMMSS |
| TIMESTAMP(
) | YYMMDDHHMMSS |
| TIMESTAMP(
) | YYMMDDHHMM |
| TIMESTAMP(
) | YYYYMMDD |
| TIMESTAMP(
) | YYMMDD |
| TIMESTAMP(
) | YYMM |
| TIMESTAMP(
) | YY |
+
+
+
完整
TIMESTAMP格式是
位
但TIMESTAMP列也可以用更短的顯示尺寸創造
最常見的顯示尺寸是
和
你可以在創建表時指定一個任意的顯示尺寸
但是定義列長為
或比
大均會被強制定義為列長
列長在從
~
范圍的奇數值尺寸均被強制為下一個更大的偶數
列如 定義字段長度 強制字段長度
TIMESTAMP(
)
> TIMESTAMP(
)
TIMESTAMP(
)
> TIMESTAMP(
)
TIMESTAMP(
)
> TIMESTAMP(
)
TIMESTAMP(
)
> TIMESTAMP(
)
所有的TIMESTAMP列都有同樣的存儲大小
使用被指定的時期時間值的完整精度(
位)存儲合法的值不考慮顯示尺寸
不合法的日期
將會被強制為
存儲
這有幾個含意 雖然你建表時定義了列TIMESTAMP(
)
但在你進行數據插入與更新時TIMESTAMP列實際上保存了
位的數據(包括年月日時分秒)
只不過在你進行查詢時MySQL返回給你的是
位的年月日數據
如果你使用ALTER TABLE拓寬一個狹窄的TIMESTAMP列
以前被
隱蔽
的信息將被顯示
同樣
縮小一個TIMESTAMP列不會導致信息失去
除了感覺上值在顯示時
較少的信息被顯示出
盡管TIMESTAMP值被存儲為完整精度
直接操作存儲值的唯一函數是UNIX_TIMESTAMP()
由於MySQL返回TIMESTAMP列的列值是進過格式化後的檢索的值
這意味著你可能不能使用某些函數來操作TIMESTAMP列(例如HOUR()或SECOND())
除非TIMESTAMP值的相關部分被包含在格式化的值中
例如
一個TIMESTAMP列只有被定義為TIMESTAMP(
)以上時
TIMESTAMP列的HH部分才會被顯示
因此在更短的TIMESTAMP值上使用HOUR()會產生一個不可預知的結果
不合法TIMESTAMP值被變換到適當類型的
零
值(
)
(DATETIME
DATE亦然)
你可以使用下列語句來驗證 CREATE TABLE test (
id
INT (
) UNSIGNED AUTO_INCREMENT
date
TIMESTAMP (
) PRIMARY KEY(
id
));
INSERT INTO test SET id =
;
SELECT * FROM test;
+
+
+
| id | date
|
+
+
+
|
|
|
+
+
+
ALTER TABLE test CHANGE
date
date
TIMESTAMP(
);
SELECT * FROM test;
+
+
+
| id | date
|
+
+
+
|
|
|
+
+
+
你可以使用TIMESTAMP列類型自動地用當前的日期和時間標記INSERT或UPDATE的操作
如果你有多個TIMESTAMP列
只有第一個自動更新
自動更新第一個TIMESTAMP列在下列任何條件下發生
列值沒有明確地在一個INSERT或LOAD DATA INFILE語句中指定
列值沒有明確地在一個UPDATE語句中指定且另外一些的列改變值
(注意一個UPDATE設置一個列為它已經有的值
這將不引起TIMESTAMP列被更新
因為如果你設置一個列為它當前的值
MySQL為了效率而忽略更改
)
你明確地設定TIMESTAMP列為NULL
除第一個以外的TIMESTAMP列也可以設置到當前的日期和時間
只要將列設為NULL
或NOW()
CREATE TABLE test (
id
INT (
) UNSIGNED AUTO_INCREMENT
date
TIMESTAMP (
)
date
TIMESTAMP (
)
PRIMARY KEY(
id
)
);
INSERT INTO test (id
date
date
) VALUES (
NULL
NULL);
INSERT INTO test SET id=
;
+
+
+
+
| id | date
| date
|
+
+
+
+
|
|
|
|
|
|
|
|
+
+
+
+
>第一條指令因設date
date
為NULL
所以date
date
值均為當前時間
第二條指令因沒有設date
date
列值
第一個TIMESTAMP列date
為更新為當前時間
而二個TIMESTAMP列date
因日期不合法而變為
UPDATE test SET id=
WHERE id=
;
+
+
+
+
| id | date
| date
|
+
+
+
+
|
|
|
|
|
|
|
|
+
+
+
+
>這條指令沒有明確地設定date
的列值
所以第一個TIMESTAMP列date
將被更新為當前時間
UPDATE test SET id=
date
=date
date
=NOW() WHERE id=
;
+
+
+
+
| id | date
| date
|
+
+
+
+
|
|
|
|
|
|
|
|
+
+
+
+
>這條指令因設定date
=date
所以在更新數據時date
列值並不會發生改變
而因設定date
=NOW()
所以在更新數據時date
列值會被更新為當前時間
此指令等效為 UPDATE test SET id=
date
=date
date
=NULL WHERE id=
;
因MySQL返回的 TIMESTAMP 列為數字顯示形式
你可以用DATE_FROMAT()函數來格式化 TIMESTAMP 列
SELECT id
DATE_FORMAT(date
%Y
%m
%d %H:%i:%s
) As date
DATE_FORMAT(date
%Y
%m
%d %H:%i:%s
) As date
FROM test;
+
+
+
+
| id | date
| date
|
+
+
+
+
|
|
:
:
|
:
:
|
|
|
:
:
|
:
:
|
+
+
+
+
SELECT id
DATE_FORMAT(date
%Y
%m
%d
) As date
DATE_FORMAT(date
%Y
%m
%d
) As date
FROM test;
+
+
+
+
| id | date
| date
|
+
+
+
+
|
|
|
|
|
|
|
|
+
+
+
+
在某種程度上
你可以把一種日期類型的值賦給一個不同的日期類型的對象
然而
而尤其注意的是
值有可能發生一些改變或信息的損失
如果你將一個DATE值賦給一個DATETIME或TIMESTAMP對象
結果值的時間部分被設置為
:
:
因為DATE值中不包含有時間信息
如果你將一個DATETIME或TIMESTAMP值賦給一個DATE對象
結果值的時間部分被刪除
因為DATE類型不存儲時間信息
盡管DATETIME
DATE和TIMESTAMP值全都可以用同樣的格式集來指定
但所有類型不都有同樣的值范圍
例如
TIMESTAMP值不能比
早
也不能比
晚
這意味著
一個日期例如
當作為一個DATETIME或DATE值時它是合法的
但它不是一個正確TIMESTAMP值!並且如果將這樣的一個對象賦值給TIMESTAMP列
它將被變換為
當指定日期值時當心某些缺陷 允許作為字符串指定值的寬松格式能被欺騙
例如
因為
:
分隔符的使用
值
:
:
可能看起來像時間值
但是如果在一個日期中使用
上下文將作為年份被解釋成
值
:
:
將被變換到
因為
不是一個合法的月份
以
位數字指定的年值是模糊的
因為世紀是未知的
MySQL使用下列規則解釋
位年值
在
范圍的年值被變換到
在范圍
的年值被變換到
From:http://tw.wingwit.com/Article/program/MySQL/201311/11205.html