這是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列的初始化和更新的規則如下所示:
· 如果一個表內的第1個TIMESTAMP列指定 為一個DEFAULT值,則不能忽略。預設值可以為CURRENT_TIMESTAMP或常量日期和時間值。
· DEFAULT NULL與第1個TIMESTAMP 列的DEFAULT CURRENT_TIMESTAMP相同。對於其它TIMESTAMP列,DEFAULT NULL被視為DEFAULT 0。
· 表內的任何一個TIMESTAMP列可以設置為自動初始化為當前時間戳和/或更新。
· 在CREATE TABLE語句中,可以用下面的任何一種方式聲明第1個TIMESTAMP列:
o 用DEFAULT CURRENT_TIMESTAMP和ON UPDATE CURRENT_TIMESTAMP子句,列為預設值使用當前的時間戳,並且自動更新。
o 不使用DEFAULT或ON 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來啟用自動更新而不讓列自動初始化)。
· 在DEFAULT和ON UPDATE子句中可以使用CURRENT_TIMESTAMP、CURRENT_TIMESTAMP()或者NOW()。它們均具有相同的效果。
兩個屬性的順序並不重要。如果一個TIMESTAMP列同時指定了DEFAULT和ON 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列指定 自動預設或更新,必須通過將第1個TIMESTAMP列顯式分配一個常量DEFAULT值來禁用自動初始化和更新。(例如,DEFAULT 0或DEFAULT’2003-01-01 00:00:00′ )。然後,對於其它TIMESTAMP列,規則與第1個TIMESTAMP列相同,例外情況是不能忽略DEFAULT和ON 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被插入到該列內。換句話說,只有使用如下定義創建,定義為 NULL的TIMESTAMP列才會自動更新:
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版本有點過舊了,希望這一題以後不會再出現囉!
1 則留言