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

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

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

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

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

  • 自动初始化的列被设置为“当前时间戳”,用于插入的行,该行为列指定无值。

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

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

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

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

请注意

下面的示例使用默认为0.,可以根据严格的SQL模式是否或其产生的警告或错误来产生警告或错误NO_ZERO_DATE已启用SQL模式。要知道传统的SQL模式包括严格模式和NO_ZERO_DATE。看到第5.1.10节,“服务器SQL模式”

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

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

    创建表T1(TS时间戳默认Current_timestamp上更新Current_Timestamp,DT DateTime默认Current_timestamp上更新Current_timestamp);
  • 与一个默认条款,但没有在更新CURRENT_TIMESTAMP子句中,列具有给定的默认值,并且不会自动更新为当前时间戳。

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

    创建表t1 (ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP, dt DATETIME DEFAULT 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)

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

    创建表T1(更新Current_Timestamp上的DT1 DateTime, - 默认NULL DT2 Datetime在更新Current_Timestamp上的NOULL NULL  - 默认值0);

时间戳约会时间列没有自动属性,除非显式地指定它们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);

表格具有以下属性:

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

  • 表格的不同之处在于壹空间列处理值。为t1,壹空间非空给它赋值将其设置为当前时间戳。为t2t3,壹空间许可证给它赋值把它设置为

  • t2t3的默认值不同壹空间。为t2,壹空间定义为允许,默认为also在没有明确的默认条款。为t3,壹空间许可证但具有明确的默认值为0。

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

创建表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.系统变量被禁用,时间戳默认列为列非空,不能包含值,分配分配当前时间戳。允许一个时间戳列包含,明确宣布它属性。在这种情况下,默认值也变为除非用默认子句指定不同的默认值。默认为null.可用于明确指定为默认值。(时间戳属性未声明的属性,默认为null.是无效的)。如果一个时间戳列许可值,分配把它设置为,不是目前的时间戳。

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

创建表T(TS1时间戳NULL默认空NULL,TS2时间戳NULL默认值0,TS3时间戳NULL默认CURRENT_TIMESTAMP);

一个时间戳允许的列值是不是除了下列条件之一之外,除了插入时间的当前时间戳:

换句话说,一个时间戳允许的列定义只有在其定义包含时,才能自动初始化默认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);

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

插入T2值(Current_timestamp);插入T1值(现在());

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