MySQL TIMESTAMP屬性

2013-03-05_090855

這是MySQL 5實力養成暨評量裡的4-50.『MySQL鐘,欄位為TIMESTAMP,設定DEFAULT為NULL的欄位有多個的時候,第幾個欄位其特性等同於DEFAULT為CURRENT_TIMESTAMP?

答案:(C) 最前面的欄位

朋友們可以參考MySQL 5.6 Reference Manual :: 11 Data Types :: 11.3 Date and Time Types :: 11.3.5 Automatic Initialization and Updating for TIMESTAMP and DATETIME

MySQL 5.1參考手冊 :: 11.列類型::11.3. 日期和時間類型::11.3.1. DATETIME、DATE和TIMESTAMP類型::11.3.1.1. 自MySQL 4.1以來的TIMESTAMP屬性

ㄚ琪轉成繁體文並節錄跟這一題目有關的資訊

註釋:在舊版本的MySQL中(4.1之前),TIMESTAMP列類型的屬性在許多方面於本節所描述的大大不同。如果你需要對舊的TIMESTAMP數據進行轉化以便在MySQL 5.1中工作,詳情請參見MySQL 4.1 參考手冊。

TIMESTAMP列的顯示格式與DATETIME列相同。換句話說,顯示寬度固定在19字符,並且格式為YYYY-MM-DD HH:MM:SS。

MySQL不接受在日或月列包括一個零或包含非法日期值的時間戳值。該規則的唯一例外是特殊值’0000-00-00 00:00:00’。

你可以非常靈便地確定什麼時候初始化和更新TIMESTAMP和對哪些列進行初始化和更新:

·         你可以將當前的時間戳指定為預設值和自動更新的值。但只能選擇一個,或者兩者都不選。(不可能一個列選擇一個行為而另一個列選擇另 ​​一個行為)

·         你可以指定哪個TIMESTAMP列自動初始化或更新為當前的日期和時間。不再需要為第1個TIMESTAMP

請注意下面所討論訊息只適用於創建時未啟用MAXDB模式的表的TIMESTAMP列。(如上所述,MAXDB模式使列創建為DATETIME列)控制TIMESTAMP列的初始化和更新的規則如下所示:

·         如果一個表內的第1TIMESTAMP列指定 ​​為一個DEFAULT值,則不能忽略。預設值可以為CURRENT_TIMESTAMP或常量日期和時間值。

·          DEFAULT NULL與第1TIMESTAMP 列的DEFAULT CURRENT_TIMESTAMP相同。對於其它TIMESTAMP列,DEFAULT NULL被視為DEFAULT 0

·         表內的任何一個TIMESTAMP列可以設置為自動初始化為當前時間戳和/或更新。

·         CREATE TABLE語句中,可以用下面的任何一種方式聲明第1TIMESTAMP列:

o        DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP子句,列為預設值使用當前的時間戳,並且自動更新。

o        不使用DEFAULTON UPDATE子句,與DEFAULT CURRENT_TIMESTAMP ON UPDATECURRENT_TIMESTAMP相同。

o        DEFAULT CURRENT_TIMESTAMP子句不用ON UPDATE子句,列為預設值使用當前的時間戳但是不自動更新。

o        不用DEFAULT子句但用ON UPDATE CURRENT_TIMESTAMP子句,列有預設值0並自動更新。

o        用常量DEFAULT值,列有給出的預設值。如果列有一個ON UPDATE CURRENT_TIMESTAMP子句,它自動更新,否則不。

換句話說,你可以為初始值和自動更新的值使用當前的時間戳,或者其中一個使用,或者兩個皆不使用。(例如,你可以指定ON UPDATE來啟用自動更新而不讓列自動初始化)

·         DEFAULTON UPDATE子句中可以使用CURRENT_TIMESTAMPCURRENT_TIMESTAMP()或者NOW()它們均具有相同的效果。

兩個屬性的順序並不重要。如果一個TIMESTAMP列同時指定了DEFAULTON UPDATE,任何一個可以在另一個的前面。

例子,下面這些語句是等效的:

CREATE TABLE t (ts TIMESTAMP);
CREATE TABLE t (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP
                             ON UPDATE CURRENT_TIMESTAMP);
CREATE TABLE t (ts TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
                             DEFAULT CURRENT_TIMESTAMP);

·         要為TIMESTAMP列而不是第1列指定 ​​自動預設或更新,必須通過將第1TIMESTAMP列顯式分配一個常量DEFAULT值來禁用自動初始化和更新。(例如,DEFAULT 0DEFAULT’2003-01-01 00:00:00′ )然後,對於其它TIMESTAMP列,規則與第1TIMESTAMP列相同,例外情況是不能忽略DEFAULTON UPDATE子句。如果這樣做,則不會自動進行初始化或更新。

例如:下面這些語句是等效的:

CREATE TABLE t (
    ts1 TIMESTAMP DEFAULT 0,
    ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
                  ON UPDATE CURRENT_TIMESTAMP);
CREATE TABLE t (
    ts1 TIMESTAMP DEFAULT 0,
    ts2 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
                  DEFAULT CURRENT_TIMESTAMP);

可以對每個連接設置當前的時區,相關描述參見5.10.8節,“MySQL服務器時區支持”TIMESTAMP值以UTC格式保存,存儲時對當前的時區進行轉換,檢索時再轉換回當前的時區。只要時區設定值為常量,便可以得到保存時的值。如果保存一個TIMESTAMP值,應更改時區然後檢索該值,它與你保存的值不同。這是因為在兩個方向的轉換中沒有使用相同的時區。當前的時區可以用作time_zone系統變量的值。

可以在TIMESTAMP列的定義中包括NULL屬性以允許列包含NULL值。例如:

CREATE TABLE t
(
  ts1 TIMESTAMP NULL DEFAULT NULL,
  ts2 TIMESTAMP NULL DEFAULT 0,
  ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
);

如果未指定NULL屬性,將欄位設置為NULL設置則會將它設置為當前的時間戳。請注意允許NULL值的TIMESTAMP列不會採用當前的時間戳,除非要么其預設值定義為CURRENT_TIMESTAMP,或者NOW()CURRENT_TIMESTAMP被插入到該列內。換句話說,只有使用如下定義創建,定義為 NULLTIMESTAMP列才會自動更新:

CREATE TABLE t (ts NULLDEFAULT CURRENT_TIMESTAMP)

否則也就是說,如果使用NULL而不是DEFAULT TIMESTAMP來定義TIMESTAMP列,如下所示

CREATE TABLE t1 (ts NULL DEFAULT NULL);
CREATE TABLE t2 (ts NULL DEFAULT '0000-00-00 00:00:00');

則必須顯式插入一個對應當前日期和時間的值。例如:

INSERT INTO t1 VALUES (NOW());
INSERT INTO t2 VALUES (CURRENT_TIMESTAMP);

ㄚ琪從上面的敘述來看,測試這樣的例子:

CREATE TABLE IF NOT EXISTS `t` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`ts1` timestamp NULL DEFAULT NULL,
`ts2` timestamp NULL DEFAULT NULL,
`ts3` timestamp NULL DEFAULT NULL,
PRIMARY KEY (`id`)
);

然後用

INSERT INTO `t` (`id`) VALUES (NULL);

來測試發現沒有任何欄位會DEFAULT為CURRENT_TIMESTAMP,可見題目的MySQL版本有點過舊了,希望這一題以後不會再出現囉!

感謝你看到這裡,很快就可以離開了,但最好的獎勵行動就是按一下幫我分享或留言,感恩喔~

點我分享到Facebook

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *