# 11.2.5 TIMESTAMP 和 DATETIME 的自动初始化和更新

时间戳约会时间列可以自动初始化并更新为当前日期和时间(即当前时间戳)。

对于任何时间戳要么约会时间表中的列,您可以将当前时间戳指定为默认值、自动更新值或两者:

  • 自动初始化的列设置为插入的行的当前时间戳,这些行没有为该列指定值。

  • 当行中任何其他列的值从其当前值更改时,自动更新的列会自动更新为当前时间戳。如果所有其他列都设置为其当前值,则自动更新的列保持不变。要防止自动更新的列在其他列更改时更新,请将其显式设置为其当前值。要更新自动更新的列,即使其他列没有更改,请将其显式设置为应具有的值(例如,将其设置为CURRENT_TIMESTAMP)。

    此外,如果显式默认值for_timestamp系统变量被禁用,您可以初始化或更新任何时间戳(但不是约会时间) 列分配给当前日期和时间空值值,除非它已与空值允许的属性空值价值观。

    要指定自动属性,请使用默认 CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP列定义中的子句。子句的顺序无关紧要。如果两者都存在于列定义中,则任何一个都可以先出现。的任何同义词CURRENT_TIMESTAMP具有相同的含义CURRENT_TIMESTAMP.这些是CURRENT_TIMESTAMP(),现在(),当地时间,当地时间(),本地时间戳, 和本地时间戳().

    用于默认 CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP特定于时间戳约会时间.这默认子句也可用于指定常量(非自动)默认值(例如,默认0要么默认“2000-01-01 00:00:00”)。

笔记

以下示例使用默认0, 一个默认值,根据是严格 SQL 模式还是NO_ZERO_DATESQL 模式已启用。请注意,传统的SQL 模式包括严格模式和NO_ZERO_DATE.看第 5.1.11 节,“服务器 SQL 模式”.

时间戳要么约会时间列定义可以为默认值和自动更新值指定当前时间戳,一个但不指定另一个,或者两者都不指定。不同的列可以有不同的自动属性组合。以下规则描述了这些可能性:

  • 默认 CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP,该列将当前时间戳作为其默认值,并自动更新为当前时间戳。

    CREATE TABLE t1 (
      ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    );
    
  • 带一个默认条款但没有ON UPDATE CURRENT_TIMESTAMP子句,该列具有给定的默认值,并且不会自动更新为当前时间戳。

    默认值取决于是否默认条款规定CURRENT_TIMESTAMP或一个常数值。和CURRENT_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子句和常数默认子句,该列会自动更新为当前时间戳,并具有给定的常量默认值。

    CREATE TABLE t1 (
      ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP,
      dt DATETIME DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP
    );
    
  • ON UPDATE CURRENT_TIMESTAMP条款但没有默认子句时,该列会自动更新为当前时间戳,但没有当前时间戳作为其默认值。

    在这种情况下,默认值取决于类型。时间戳除非用空值属性,在这种情况下,默认值为空值.

    CREATE TABLE t1 (
      ts1 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,     -- default 0
      ts2 TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP -- default NULL
    );
    

    约会时间有一个默认值空值除非用非空属性,在这种情况下,默认值为 0。

    CREATE TABLE t1 (
      dt1 DATETIME ON UPDATE CURRENT_TIMESTAMP,         -- default NULL
      dt2 DATETIME NOT NULL ON UPDATE CURRENT_TIMESTAMP -- default 0
    );
    

时间戳约会时间除非明确指定列,否则列没有自动属性,但有以下例外:如果显式默认值for_timestamp系统变量被禁用时,第一的 时间戳列都有默认 CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP如果两者都没有明确指定。抑制第一个的自动属性时间戳列,使用以下策略之一:

  • 启用显式默认值for_timestamp系统变量。在这种情况下,默认 CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP指定自动初始化和更新的子句可用,但未分配给任何时间戳列,除非明确包含在列定义中。

  • 或者,如果显式默认值for_timestamp已禁用,请执行以下任一操作:

    • 用 a 定义列默认指定常量默认值的子句。

    • 指定空值属性。这也导致该列允许空值值,这意味着您不能通过将列设置为来分配当前时间戳空值.分配空值将列设置为空值,而不是当前时间戳。要分配当前时间戳,请将列设置为CURRENT_TIMESTAMP或同义词,例如现在().

    考虑这些表定义:

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);

这些表具有以下属性:

  • 在每个表定义中,第一个时间戳列没有自动初始化或更新。

  • 这些表的不同之处在于ts1柱柄空值价值观。为了t1,ts1非空并为其赋值空值将其设置为当前时间戳。为了t2t3,ts1许可证空值并为其赋值空值将其设置为空值.

  • t2t3默认值不同ts1.为了t2,ts1被定义为允许空值,所以默认也是空值在没有明确的默认条款。为了t3,ts1许可证空值但显式默认值为 0。

    如果一个时间戳要么约会时间列定义在任何地方都包含显式的小数秒精度值,必须在整个列定义中使用相同的值。这是允许的:

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 属性

如果显式默认值for_timestamp系统变量被禁用,时间戳默认情况下,列是非空, 不能包含空值值和赋值空值分配当前时间戳。允许一个时间戳要包含的列空值, 用空值属性。在这种情况下,默认值也变为空值除非被覆盖默认指定不同默认值的子句。默认空可用于显式指定空值作为默认值。(为一个时间戳未与声明的列空值属性,默认空无效。)如果时间戳列许可证空值值,赋值空值将其设置为空值,而不是当前时间戳。

下表包含几个时间戳允许的列空值价值观:

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

一种时间戳允许的列空值价值观确实不是在插入时采用当前时间戳,但以下情况之一除外:

  • 其默认值定义为CURRENT_TIMESTAMP并且没有为该列指定值

  • CURRENT_TIMESTAMP或其任何同义词,例如现在()被显式插入到列中

    换句话说,一个时间戳定义为允许的列空值values 仅在其定义包括时自动初始化默认 CURRENT_TIMESTAMP

CREATE TABLE t (ts TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP);

如果时间戳列许可证空值值,但其定义不包括默认 CURRENT_TIMESTAMP,您必须显式插入与当前日期和时间对应的值。假设表t1t2有这些定义:

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

设置时间戳任一表中的列到插入时的当前时间戳,显式为其分配该值。例如:

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

如果显式默认值for_timestamp系统变量已启用,时间戳列允许空值仅当使用空值属性。还,时间戳列不允许分配空值分配当前时间戳,无论是否用空值要么非空属性。要分配当前时间戳,请将列设置为CURRENT_TIMESTAMP或同义词,例如现在().