时间戳
和约会时间
列可以自动初始化并更新为当前日期和时间(即当前时间戳)。
对于任何一个时间戳
或约会时间
表中的列,可以将当前时间戳指定为默认值、自动更新值或两者都指定:
自动初始化的列被设置为“当前时间戳”,用于插入的行,该行为列指定无值。
当行中任何其他列的值从其当前值更改时,自动更新的列将自动更新为当前时间戳。如果将所有其他列设置为当前值,则自动更新的列将保持不变。若要防止自动更新的列在其他列更改时更新,请显式地将其设置为当前值。要在其他列没有更改的情况下更新自动更新的列,显式地将其设置为它应有的值(例如,将其设置为
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
,壹空间
是非空
给它赋值零
将其设置为当前时间戳。为t2
和t3
,壹空间
许可证零
给它赋值零
把它设置为零
。t2
和t3
的默认值不同壹空间
。为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
并且没有为列指定值CURRENT_TIMESTAMP
或者它的同义词,例如现在()
明确插入列中
换句话说,一个时间戳
允许的列定义零
只有在其定义包含时,才能自动初始化默认Current_timestamp.
:
创建表t (ts TIMESTAMP NULL DEFAULT CURRENT_TIMESTAMP);
如果是时间戳
列许可零
值,但其定义不包括默认Current_timestamp.
,必须明确地插入与当前日期和时间对应的值。假设表格t1
和t2
有这些定义:
创建表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
或同义词如现在()
。