10bet网址
MySQL 8.0参考手册
相关的文档10bet官方网站 下载本手册 本手册摘录

MySQL 8.0参考手册/....../ TIMESTAMP和DATETIME的自动初始化和更新

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

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

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

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

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

另外,如果是explicit_defaults_for_timestamp系统变量被禁用时,可以初始化或更新任何时间戳(但不DATETIME)列到当前日期和时间通过分配a值,除非已用允许的属性价值观。

若要指定自动属性,请使用默认CURRENT_TIMESTAMP在更新Current_timestamp.列定义中的子句。条款的顺序没有关系。如果两者都出现在列定义中,则任何一个都可以先出现。同义词…的同义词CURRENT_TIMESTAMP有相同的含义CURRENT_TIMESTAMP.这些都是current_timestamp()现在()本地时间作用是()LOCALTIMESTAMP,LOCALTIMESTAMP ()

使用默认CURRENT_TIMESTAMP在更新Current_timestamp.是特定于时间戳DATETIME.的默认的子句也可用于指定常量(非自动)默认值(例如,默认值0默认的2000-01-01就是).

笔记

以下示例使用默认值0,它可以产生警告或错误,具体取决于严格SQL模式还是no_zero_date.启用S​​QL模式。意识到传统的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);
  • 与一个默认的条款但是没有在更新Current_timestamp.子句中,列具有给定的默认值,并且不会自动更新为当前时间戳。

    默认值取决于是否默认的条款指定CURRENT_TIMESTAMP或恒定值。和CURRENT_TIMESTAMP,默认值是当前时间戳。

    创建表t1 (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP, dt DATETIME DEFAULT CURRENT_TIMESTAMP);

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

    创建表T1(TS时间戳默认值0,DT DateTime默认值0);
  • 在更新Current_timestamp.子句和一个常量默认的子句,列会自动更新到当前时间戳,并具有给定的常量默认值。

    创建表T1(更新Current_Timestamp上的TS时间戳默认值0,更新Current_timestamp上的DT DateTime默认值0);
  • 在更新Current_timestamp.条款但是没有默认的子句,该列被自动更新到当前时间戳,但不具有当前时间戳的默认值。

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

    创建表T1(更新Current_Timestamp上的TS1时间戳, - 默认为0 TS2 TIMESTAMP null on更新Current_timestamp  - 默认为空);

    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时间戳默认值0,TS2时间戳默认Current_timestamp上更新Current_timestamp);创建表T2(TS1时间戳NULL,TS2 TIMESTAMP默认CURRENT_TIMESTAMP上更新CURRENT_TIMESTAMP);创建表T3(TS1时间戳NULL默认值0,TS2 TIMESTAMP默认CURRUME_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP);

这些表有以下属性:

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

  • 表格的不同之处在于壹空间列处理价值观。为了T1.壹空间没有空并将其分配值将其设置为当前时间戳。为了T2.T3.壹空间许可证并将其分配值将它设置为

  • T2.T3.默认值不同壹空间.为了T2.壹空间被定义为允许,默认为also在没有明确的默认的条款。为了T3.壹空间许可证但是有一个显式的默认值0。

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

在更新Current_timestamp(6)上创建表T1(TS时间戳(6)默认Current_Timestamp(6));

这是不允许的:

创建表T1(TS时间戳(6)更新Current_Timestamp(3)上的默认Current_timestamp);

时间戳初始化和null属性

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

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

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

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

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

创建表T(ts时间戳null默认current_timestamp);

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

创建表T1(TS时间戳NULL默认为'0000-00-00 00:00:00');创建表T2(TS时间戳NULL默认为NULL);

设置时间戳在插入时间下的当前时间戳的表中的列,显式分配该值。例如:

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

如果explicit_defaults_for_timestamp启用系统变量,时间戳列许可证属性声明时才使用属性。还,时间戳列不允许赋值指定当前时间戳,是否使用没有空属性。若要指定当前时间戳,请将列设置为CURRENT_TIMESTAMP或者是一个同义词,如现在()