TIMESTAMP
和 DATETIME
欄位可以自動初始化和更新為目前的日期和時間(即目前的 timestamp)。
對於資料表中的任何 TIMESTAMP
或 DATETIME
欄位,您可以將目前的 timestamp 指派為預設值、自動更新值,或兩者皆是
自動初始化的欄位會針對未指定該欄位值的插入列設定為目前的 timestamp。
當列中任何其他欄位的值從其目前值變更時,自動更新的欄位會自動更新為目前的 timestamp。如果所有其他欄位都設定為其目前值,則自動更新的欄位保持不變。若要防止自動更新的欄位在其他欄位變更時更新,請明確地將其設定為其目前值。若要即使其他欄位未變更也更新自動更新的欄位,請明確地將其設定為它應該有的值(例如,將其設定為
CURRENT_TIMESTAMP
)。
此外,如果停用了 explicit_defaults_for_timestamp
系統變數,則可以透過指派 NULL
值將任何 TIMESTAMP
(但不是 DATETIME
)欄位初始化或更新為目前的日期和時間,除非已使用 NULL
屬性定義該欄位以允許 NULL
值。
若要指定自動屬性,請在欄位定義中使用 DEFAULT CURRENT_TIMESTAMP
和 ON UPDATE CURRENT_TIMESTAMP
子句。子句的順序並不重要。如果欄位定義中同時存在這兩個子句,則任何一個都可以先出現。任何 CURRENT_TIMESTAMP
的同義詞都具有與 CURRENT_TIMESTAMP
相同的意義。它們是 CURRENT_TIMESTAMP()
、NOW()
、LOCALTIME
、LOCALTIME()
、LOCALTIMESTAMP
和 LOCALTIMESTAMP()
。
DEFAULT CURRENT_TIMESTAMP
和 ON UPDATE CURRENT_TIMESTAMP
的使用專屬於 TIMESTAMP
和 DATETIME
。DEFAULT
子句也可用於指定常數(非自動)預設值(例如,DEFAULT 0
或 DEFAULT '2000-01-01 00:00:00'
)。
以下範例使用 DEFAULT 0
,這是一個預設值,根據是否啟用嚴格 SQL 模式或 NO_ZERO_DATE
SQL 模式,可能會產生警告或錯誤。請注意,TRADITIONAL
SQL 模式包含嚴格模式和 NO_ZERO_DATE
。請參閱第 7.1.11 節,「伺服器 SQL 模式」。
TIMESTAMP
或 DATETIME
欄位定義可以為預設值和自動更新值都指定目前的 timestamp、只指定其中一個但不指定另一個,或都不指定。不同的欄位可以具有自動屬性的不同組合。以下規則描述了各種可能性
同時具有
DEFAULT CURRENT_TIMESTAMP
和ON UPDATE CURRENT_TIMESTAMP
,該欄位的預設值為目前的 timestamp,並自動更新為目前的 timestamp。CREATE TABLE t1 ( ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP );
具有
DEFAULT
子句但沒有ON UPDATE CURRENT_TIMESTAMP
子句,該欄位具有給定的預設值,且不會自動更新為目前的 timestamp。預設值取決於
DEFAULT
子句是否指定CURRENT_TIMESTAMP
或常數值。使用CURRENT_TIMESTAMP
時,預設值為目前的 timestamp。CREATE TABLE t1 ( ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP, dt DATETIME DEFAULT CURRENT_TIMESTAMP );
使用常數時,預設值為給定的值。在這種情況下,該欄位完全沒有自動屬性。
CREATE TABLE t1 ( ts TIMESTAMP DEFAULT 0, dt DATETIME DEFAULT 0 );
使用
ON UPDATE CURRENT_TIMESTAMP
子句和常數DEFAULT
子句,該欄位會自動更新為目前的 timestamp,並具有給定的常數預設值。CREATE TABLE t1 ( ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP, dt DATETIME DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP );
使用
ON UPDATE CURRENT_TIMESTAMP
子句但沒有DEFAULT
子句,該欄位會自動更新為目前的 timestamp,但其預設值不是目前的 timestamp。在這種情況下,預設值取決於類型。
TIMESTAMP
的預設值為 0,除非已使用NULL
屬性定義,在這種情況下預設值為NULL
。CREATE TABLE t1 ( ts1 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, -- default 0 ts2 TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP -- default NULL );
DATETIME
的預設值為NULL
,除非已使用NOT NULL
屬性定義,在這種情況下預設值為 0。CREATE TABLE t1 ( dt1 DATETIME ON UPDATE CURRENT_TIMESTAMP, -- default NULL dt2 DATETIME NOT NULL ON UPDATE CURRENT_TIMESTAMP -- default 0 );
TIMESTAMP
和 DATETIME
欄位除非明確指定,否則沒有自動屬性,但有一個例外:如果 explicit_defaults_for_timestamp
系統變數被禁用,則第一個 TIMESTAMP
欄位,在沒有明確指定的情況下,會同時具有 DEFAULT CURRENT_TIMESTAMP
和 ON UPDATE CURRENT_TIMESTAMP
。若要抑制第一個 TIMESTAMP
欄位的自動屬性,請使用以下其中一種策略。
啟用
explicit_defaults_for_timestamp
系統變數。在此情況下,指定自動初始化和更新的DEFAULT CURRENT_TIMESTAMP
和ON UPDATE CURRENT_TIMESTAMP
子句是可用的,但除非明確包含在欄位定義中,否則不會將其分配給任何TIMESTAMP
欄位。或者,如果
explicit_defaults_for_timestamp
被禁用,請執行以下任一操作:使用
DEFAULT
子句定義欄位,該子句指定常數預設值。指定
NULL
屬性。這也會使欄位允許NULL
值,這表示您無法透過將欄位設定為NULL
來指定目前的時間戳記。指定NULL
會將欄位設定為NULL
,而不是目前的時間戳記。若要指定目前的時間戳記,請將欄位設定為CURRENT_TIMESTAMP
或其同義詞,例如NOW()
。
請考慮以下表格定義:
CREATE TABLE t1 (
ts1 TIMESTAMP DEFAULT 0,
ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP);
CREATE TABLE t2 (
ts1 TIMESTAMP NULL,
ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP);
CREATE TABLE t3 (
ts1 TIMESTAMP NULL DEFAULT 0,
ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP
ON UPDATE CURRENT_TIMESTAMP);
表格具有以下屬性:
在每個表格定義中,第一個
TIMESTAMP
欄位沒有自動初始化或更新。表格的差異在於
ts1
欄位如何處理NULL
值。對於t1
,ts1
是NOT NULL
,並將其設定為NULL
值,會將其設定為目前的時間戳記。對於t2
和t3
,ts1
允許NULL
,並將其設定為NULL
值,會將其設定為NULL
。t2
和t3
在ts1
的預設值方面有所不同。對於t2
,ts1
定義為允許NULL
,因此在沒有明確的DEFAULT
子句的情況下,預設值也為NULL
。對於t3
,ts1
允許NULL
,但有一個明確的預設值 0。
如果 TIMESTAMP
或 DATETIME
欄位定義在任何地方包含明確的小數秒精度值,則必須在整個欄位定義中使用相同的值。這是允許的:
CREATE TABLE t1 (
ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6)
);
這是不允許的:
CREATE TABLE t1 (
ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(3)
);
TIMESTAMP 初始化和 NULL 屬性
如果 explicit_defaults_for_timestamp
系統變數被禁用,則預設情況下,TIMESTAMP
欄位是 NOT NULL
,不能包含 NULL
值,並且指定 NULL
會指定目前的時間戳記。若要允許 TIMESTAMP
欄位包含 NULL
,請使用 NULL
屬性明確宣告它。在這種情況下,除非使用指定不同預設值的 DEFAULT
子句覆蓋,否則預設值也會變為 NULL
。 DEFAULT NULL
可以用來明確指定 NULL
作為預設值。(對於未宣告 NULL
屬性的 TIMESTAMP
欄位,DEFAULT NULL
是無效的。)如果 TIMESTAMP
欄位允許 NULL
值,指定 NULL
會將其設定為 NULL
,而不是目前的時間戳記。
下表包含幾個允許 NULL
值的 TIMESTAMP
欄位:
CREATE TABLE t
(
ts1 TIMESTAMP NULL DEFAULT NULL,
ts2 TIMESTAMP NULL DEFAULT 0,
ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP
);
允許 NULL
值的 TIMESTAMP
欄位,在插入時不會採用目前的時間戳記,除非符合以下其中一個條件:
其預設值定義為
CURRENT_TIMESTAMP
且未指定欄位的值。將
CURRENT_TIMESTAMP
或其任何同義詞(例如NOW()
)明確插入到欄位中。
換句話說,只有當其定義包含 DEFAULT CURRENT_TIMESTAMP
時,定義為允許 NULL
值的 TIMESTAMP
欄位才會自動初始化。
CREATE TABLE t (ts TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP);
如果 TIMESTAMP
欄位允許 NULL
值,但其定義不包含 DEFAULT CURRENT_TIMESTAMP
,您必須明確插入與目前日期和時間相對應的值。假設表格 t1
和 t2
具有以下定義:
CREATE TABLE t1 (ts TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00');
CREATE TABLE t2 (ts TIMESTAMP NULL DEFAULT NULL);
若要在插入時將任一表格中的 TIMESTAMP
欄位設定為目前的時間戳記,請明確將該值指定給它。例如:
INSERT INTO t2 VALUES (CURRENT_TIMESTAMP);
INSERT INTO t1 VALUES (NOW());
如果啟用了 explicit_defaults_for_timestamp
系統變數,只有在宣告了 NULL
屬性的情況下,TIMESTAMP
欄位才允許 NULL
值。此外,無論是否使用 NULL
或 NOT NULL
屬性宣告,TIMESTAMP
欄位都不允許指定 NULL
來指定目前的時間戳記。若要指定目前的時間戳記,請將欄位設定為 CURRENT_TIMESTAMP
或其同義詞,例如 NOW()
。