时间戳
和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.
启用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);
与一个
默认的
条款但是没有在更新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);
一种时间戳
列,允许零
值是不在插入时采用当前时间戳,但在以下条件之一下除外:
其默认值定义为
CURRENT_TIMESTAMP
没有为列指定值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
或者是一个同义词,如现在()
.