时间戳
和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
柱柄空值
值。为t1
,TS1
是非空
给它赋值空值
将其设置为当前时间戳。为t2
和t3
,TS1
许可证空值
给它赋值空值
将它设置为空值
.t2
和t3
的默认值不同TS1
.为t2
,TS1
定义为允许空值
,所以默认也是如此空值
在没有明确的情况下默认的
条款。为t3
,TS1
许可证空值
但是有一个显式的默认值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);
一个时间戳
列,允许空值
价值不在插入时采用当前时间戳,但在以下条件之一下除外:
其默认值定义为
current_timestamp.
并且没有为列指定值current_timestamp.
或者它的同义词,例如现在()
显式地插入到列中
换句话说,a时间戳
列定义为允许空值
只有当值的定义包含时,值才会自动初始化默认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);
设置时间戳
列在插入时将该值显式地赋给当前时间戳。例如:
INSERT INTO t2 VALUES (CURRENT_TIMESTAMP);INSERT INTO t1 VALUES (NOW());
如果explicit_defaults_for_timestamp
系统变量已启用,时间戳
列允许空值
仅限值空值
属性。同时,时间戳
列不允许分配空值
分配当前时间戳,无论是否声明空值
或者非空
属性。若要指定当前时间戳,请将列设置为current_timestamp.
或同义词如现在()
.