10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 本手册下载
PDF (Ltr)- 41.2 mb
PDF (A4)- 41.3 mb
PDF (RPM)- 39.5MB.
HTML下载(TGZ)- 9.3 mb
HTML下载(邮政编码)- 9.3 mb
HTML下载(RPM)- 7.8 mb
手册页(TGZ)- 260.6 kb
男人页(zip)- 371.8 kb
信息(Gzip)- 4.0 mb
信息(邮政编码)- 4.0 mb
从本手册中摘录

MySQL 8.0参考手册/.../ 自动初始化和更新时间戳和DATETIME

11.2.5自动初始化和更新时间戳和日期时间

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

对于任何时间戳或者DATETIME表中的列,可以将当前时间戳分配为默认值,自动更新值或两者:

  • 对于插入的未为列指定值的行,将自动初始化的列设置为当前时间戳。

  • 当行中任何其他列的值从其当前值更改时,自动更新的列将自动更新为当前时间戳。如果将所有其他列设置为当前值,则自动更新的列将保持不变。若要防止自动更新的列在其他列更改时更新,请显式地将其设置为当前值。要在其他列没有更改的情况下更新自动更新的列,显式地将其设置为它应有的值(例如,将其设置为current_timestamp.).

此外,如果explicit_defaults_for_timestamp系统变量被禁用时,可以初始化或更新任何时间戳(但不DATETIME)列,将其指定为当前日期和时间空值价值,除非已经定义了空值属性允许空值值。

若要指定自动属性,请使用默认CURRENT_TIMESTAMP在更新CURRENT_TIMESTAMP列定义中的子句。条款的顺序无关紧要。如果两者都存在于列定义中,则可以首先发生。任何一个同义词current_timestamp.有相同的意思吗current_timestamp..这些都是CURRENT_TIMESTAMP ()现在()本地时间当地时间()LOCALTIMESTAMP, 和LOCALTIMESTAMP ()

使用默认CURRENT_TIMESTAMP在更新CURRENT_TIMESTAMP是特定于时间戳DATETIME.这默认的子句还可以用于指定常量(非自动)的默认值(例如,默认值0或者默认'2000-01-01 00:00:00').

请注意

下面的示例使用默认值0,它可以产生警告或错误,具体取决于严格SQL模式还是NO_ZERO_DATE已启用SQL模式。要知道传统的SQL模式包括严格模式和NO_ZERO_DATE.看第5.1.11节,“服务器SQL模式”

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

  • 默认CURRENT_TIMESTAMP在更新CURRENT_TIMESTAMP,该列具有其默认值的当前时间戳,并自动更新为当前时间戳。

    创建表t1 (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);
  • 与A.默认的条款,但没有在更新CURRENT_TIMESTAMP子句,列具有给定的默认值,不会自动更新到当前时间戳。

    默认值取决于是否默认的子句指定current_timestamp.或者一个常数值。与current_timestamp.,默认为当前时间戳。

    创建表T1(TS时间戳默认Current_timestamp,DT DateTime默认Current_Timestamp);

    对于常量,默认是给定的值。在这种情况下,列根本没有自动属性。

    创建表t1 (ts TIMESTAMP DEFAULT 0, dt DATETIME DEFAULT 0);
  • 与一个在更新CURRENT_TIMESTAMP子句和一个常量默认的子句,该列将自动更新为当前时间戳,并具有给定的常量默认值。

    创建表t1 (ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP, dt DATETIME DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP);
  • 与一个在更新CURRENT_TIMESTAMP条款,但没有默认的子句后,列将自动更新为当前时间戳,但其默认值没有当前时间戳。

    在这种情况下,默认值依赖于类型。时间戳默认值为0,除非使用空值属性,在这种情况下默认为空值

    创建表t1 (ts1 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,——default 0 ts2 TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP——default NULL)

    DATETIME有一个默认的空值除非是用非空属性,在这种情况下,默认值为0。

    创建表t1 (dt1 DATETIME ON UPDATE CURRENT_TIMESTAMP,——default NULL);

时间戳DATETIME除非明确指定,否则列没有自动属性,其中包含:如果是explicit_defaults_for_timestamp系统变量被禁用,则第一个时间戳列有默认CURRENT_TIMESTAMP在更新CURRENT_TIMESTAMP如果两者都没有明确指定。为第一个禁用自动属性时间戳专栏,使用以下策略之一:

  • 启用explicit_defaults_for_timestamp系统变量。在这种情况下默认CURRENT_TIMESTAMP在更新CURRENT_TIMESTAMP可以使用指定自动初始化和更新的子句,但不能赋值给任何子句时间戳列,除非列定义中显式包含。

  • 另外,如果explicit_defaults_for_timestamp禁用,请执行以下任一操作:

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

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

考虑以下表定义:

创建表t1 (ts1 TIMESTAMP DEFAULT 0, ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);创建表t2 (ts1 TIMESTAMP NULL, ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);创建表t3 (ts1 TIMESTAMP NULL DEFAULT 0, ts2 TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);

这些表有以下属性:

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

  • 表格有所不同TS1柱柄空值值。为t1TS1非空给它赋值空值将其设置为当前时间戳。为t2t3TS1许可证空值给它赋值空值将它设置为空值

  • t2t3的默认值不同TS1.为t2TS1定义为允许空值,所以默认也是如此空值在没有明确的情况下默认的条款。为t3TS1许可证空值但是有一个显式的默认值0。

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

创建表t1 (ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6));

这是不允许的:

创建表t1 (ts TIMESTAMP(6) DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP(3));

TIMESTAMP初始化和NULL属性

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

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

创建表t (ts1 TIMESTAMP NULL DEFAULT NULL, ts2 TIMESTAMP NULL DEFAULT 0, ts3 TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP);

一个时间戳列,允许空值价值在插入时采用当前时间戳,但在以下条件之一下除外:

换句话说,a时间戳列定义为允许空值只有当值的定义包含时,值才会自动初始化默认CURRENT_TIMESTAMP

创建表t (ts TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP);

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

创建表t1 (ts TIMESTAMP NULL DEFAULT '0000-00-00 00:00:00');创建表t2 (ts TIMESTAMP NULL DEFAULT NULL);

设置时间戳列在插入时将该值显式地赋给当前时间戳。例如:

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

如果explicit_defaults_for_timestamp系统变量已启用,时间戳列允许空值仅限值空值属性。同时,时间戳列不允许分配空值分配当前时间戳,无论是否声明空值或者非空属性。若要指定当前时间戳,请将列设置为current_timestamp.或同义词如现在()