文件首頁
MySQL 8.4 參考手冊
相關文件 下載本手冊
PDF (美式信紙) - 39.9Mb
PDF (A4) - 40.0Mb
Man Pages (TGZ) - 258.5Kb
Man Pages (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 參考手冊  /  ...  /  TIMESTAMP 和 DATETIME 的自動初始化和更新

13.2.5 TIMESTAMP 和 DATETIME 的自動初始化和更新

TIMESTAMPDATETIME 欄位可以自動初始化和更新為目前的日期和時間(即目前的 timestamp)。

對於資料表中的任何 TIMESTAMPDATETIME 欄位,您可以將目前的 timestamp 指派為預設值、自動更新值,或兩者皆是

  • 自動初始化的欄位會針對未指定該欄位值的插入列設定為目前的 timestamp。

  • 當列中任何其他欄位的值從其目前值變更時,自動更新的欄位會自動更新為目前的 timestamp。如果所有其他欄位都設定為其目前值,則自動更新的欄位保持不變。若要防止自動更新的欄位在其他欄位變更時更新,請明確地將其設定為其目前值。若要即使其他欄位未變更也更新自動更新的欄位,請明確地將其設定為它應該有的值(例如,將其設定為 CURRENT_TIMESTAMP)。

此外,如果停用了 explicit_defaults_for_timestamp 系統變數,則可以透過指派 NULL 值將任何 TIMESTAMP(但不是 DATETIME)欄位初始化或更新為目前的日期和時間,除非已使用 NULL 屬性定義該欄位以允許 NULL 值。

若要指定自動屬性,請在欄位定義中使用 DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP 子句。子句的順序並不重要。如果欄位定義中同時存在這兩個子句,則任何一個都可以先出現。任何 CURRENT_TIMESTAMP 的同義詞都具有與 CURRENT_TIMESTAMP 相同的意義。它們是 CURRENT_TIMESTAMP()NOW()LOCALTIMELOCALTIME()LOCALTIMESTAMPLOCALTIMESTAMP()

DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP 的使用專屬於 TIMESTAMPDATETIMEDEFAULT 子句也可用於指定常數(非自動)預設值(例如,DEFAULT 0DEFAULT '2000-01-01 00:00:00')。

注意

以下範例使用 DEFAULT 0,這是一個預設值,根據是否啟用嚴格 SQL 模式或 NO_ZERO_DATE SQL 模式,可能會產生警告或錯誤。請注意,TRADITIONAL SQL 模式包含嚴格模式和 NO_ZERO_DATE。請參閱第 7.1.11 節,「伺服器 SQL 模式」

TIMESTAMPDATETIME 欄位定義可以為預設值和自動更新值都指定目前的 timestamp、只指定其中一個但不指定另一個,或都不指定。不同的欄位可以具有自動屬性的不同組合。以下規則描述了各種可能性

  • 同時具有 DEFAULT CURRENT_TIMESTAMPON 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
    );

TIMESTAMPDATETIME 欄位除非明確指定,否則沒有自動屬性,但有一個例外:如果 explicit_defaults_for_timestamp 系統變數被禁用,則第一個 TIMESTAMP 欄位,在沒有明確指定的情況下,會同時具有 DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP。若要抑制第一個 TIMESTAMP 欄位的自動屬性,請使用以下其中一種策略。

  • 啟用 explicit_defaults_for_timestamp 系統變數。在此情況下,指定自動初始化和更新的 DEFAULT CURRENT_TIMESTAMPON 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 值。對於 t1ts1NOT NULL,並將其設定為 NULL 值,會將其設定為目前的時間戳記。對於 t2t3ts1 允許 NULL,並將其設定為 NULL 值,會將其設定為 NULL

  • t2t3ts1 的預設值方面有所不同。對於 t2ts1 定義為允許 NULL,因此在沒有明確的 DEFAULT 子句的情況下,預設值也為 NULL。對於 t3ts1 允許 NULL,但有一個明確的預設值 0。

如果 TIMESTAMPDATETIME 欄位定義在任何地方包含明確的小數秒精度值,則必須在整個欄位定義中使用相同的值。這是允許的:

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 子句覆蓋,否則預設值也會變為 NULLDEFAULT 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 欄位,在插入時不會採用目前的時間戳記,除非符合以下其中一個條件:

換句話說,只有當其定義包含 DEFAULT CURRENT_TIMESTAMP 時,定義為允許 NULL 值的 TIMESTAMP 欄位才會自動初始化。

CREATE TABLE t (ts TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP);

如果 TIMESTAMP 欄位允許 NULL 值,但其定義不包含 DEFAULT CURRENT_TIMESTAMP,您必須明確插入與目前日期和時間相對應的值。假設表格 t1t2 具有以下定義:

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 值。此外,無論是否使用 NULLNOT NULL 屬性宣告,TIMESTAMP 欄位都不允許指定 NULL 來指定目前的時間戳記。若要指定目前的時間戳記,請將欄位設定為 CURRENT_TIMESTAMP 或其同義詞,例如 NOW()