TIMESTAMP和DATETIME类型自动初始化(Automatic Initialization and Updating for TIMESTAMP and DATETIME)

TIMESTAMP 和 DATETIME 列可以自动初始化和更新到当前的日期和时间(也就是,当前的时间戳)。

对于一个表中的TIMESTAMP 或 DATETIME列来说,你可以赋予当前时间为默认值或更新值,或者全部。

  • 如果该列没有指定值,一个自动初始化值的列会被设置为当前的时间戳

  • 一个自动更新的列会自动更新到当前的时间戳,如果该行任何其它列的值从当前值改变成另外的值。自动更新列的值保持不变如果其它列的值设置为他们的当前值。为了阻止自动更新列自动更新,需要显示设置其值为当前值。要显示的更新自动更新的列的值即使其他列的值没有改变,显示的设置他应该有的值(例如,设置其值为CURRENT_TIMESTAMP)。

额外的,如果explict_defaults_for_timestamp系统变量被禁用,你可以初始化或更新作何TIMESTAMP(但不是DATETIME)列到当前日期和时间通过给其赋值NULL,除非该列被定义为NULL值允许NULL值。

指定自动属性,使用DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP在列定义语句。语句的顺序是没问题的。如果都出现在列定义语句中,哪个都可以出现在第一。任何CURRENT_TIMESTAMP的同意词与CURRENT_TIMESTAMP的意思是一样的。这些同意词是CURRENT_TIMESTAMP()NOW(), LOCALTIME, LOCALTIME(), LOCALTIMESTAMPLOCALTIMESTAMP(),

使用DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP会使用具体的TIMESTAMPDATETIMEDEFAULT语句也可以指定一个常量(不是自动变化)的默认值;例如,DEFAULT 0DEFAULT '2000-01-01 00:00:00'

注意: 示例中使用DEFAULT 0,默认情况下能可能会产生警告或错误取决于是否是严格的SQL格式或NO_ZERO_DATESQL模式是否被启用了。要注意TRADITIONAL SQL模式包括了严格模式和NO_ZERO_DATE。查看Section 5.1.8, "Server SQL MODES"

  • 当同时有DEFAULT CURRENT_TIMESTAMPON UPDATE CURRENT_TIMESTAMP,此列使用当前的时间戳作为其默认值,当更新时自动更新成更新时间的时间戳。
mysql>  CREATE TABLE t1 (
    ->   ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    ->    dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
    -> );
  • 当具有DEFAULT语句没有ON UPDATE CURRENT_TIMESTAMP语句时,该列被赋予默认值,更新时不会赋予当前的时间戳的值。 默认值取决于DEFAULT语句是否指定了CURRENT_TIMESTAMP或一个常量。CURRENT_TIMESTAMP,默认是当前的时间戳。
mysql> CREATE TABLE t1 (
    ->   ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
    ->   dt DATETIME DEFAULT CURRENT_TIMESTAMP
    -> );
  • 当设置默认值为一个常量时,默认是指定的值。在这种情况下,此列不再有自动变化的值
CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT 0,
  dt DATETIME DEFAULT 0
);
  • 当具有ON UPDATE CURRENT_TIMESTAMP语句和一个常量DEFAULT语句时,该更新时会设置为当前的时间戳,且将指定的常量作为默认值。
CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT 0 ON UPDATE CURRENT_TIMESTAMP
);
  • 当具有ON UPDATE CURRENT_TIMESTAMP语句但没有DEFAULT语句,此列会自动更新当前的时间戳,但不将当前时间戳作为默认值。

默认值在此情况下是类型独立的。TIMESTAMP有默认值0除非用NULL定义了,在这种情况下默认值是NULL

CREATE TABLE t1 (
  ts1 TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,     -- default 0
  ts2 TIMESTAMP NULL ON UPDATE CURRENT_TIMESTAMP -- default NULL
);

DATETIME具有的默认值是NULL除非用NOT NULL定义了,在这种情况下,默认值是0。

CREATE TABLE t1 (
  dt1 DATETIME ON UPDATE CURRENT_TIMESTAMP,         -- default NULL
  dt2 DATETIME NOT NULL ON UPDATE CURRENT_TIMESTAMP -- default 0
);

results matching ""

    No results matching ""