MySQL 时间字段自动更新

2,121 阅读2分钟

「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战

在做业务的时候,有经常需要修改时间字段, 为了避免在业务中设置时间字段,可以利用 MySQLON UPDATE CURRENT_TIMESTAMP实现时间字段自动更新.

语法说明:

col DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
col TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP

示例:

`gmt_modified` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '记录最后更新时间',

设置小数时, 精度要一致

  `gmt_modified` datetime(3) NOT NULL DEFAULT CURRENT_TIMESTAMP(3) ON UPDATE CURRENT_TIMESTAMP(3) COMMENT '记录最后更新时间',

这个 3 指的是时间精度

在这里插入图片描述

如果精度不一致,会报错: ERROR 1067 (42000): Invalid default value for 'tmt'

自动更新的时间值设置

原文:

To specify automatic properties, use the DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP clauses in column definitions. The order of the clauses does not matter. If both are present in a column definition, either can occur first. Any of the synonyms for CURRENT_TIMESTAMP have the same meaning as CURRENT_TIMESTAMP. These are CURRENT_TIMESTAMP(), NOW(), LOCALTIME, LOCALTIME(), LOCALTIMESTAMP, and LOCALTIMESTAMP().

CURRENT_TIMESTAMP还可以替换为任何等价标识符,如CURRENT_TIMESTAMP()NOW()LOCALTIME, LOCALTIME()LOCALTIMESTAMP

自动更新值时,CURRENT_TIMESTAMP表示的是SQL执行时的时间。如果要写入实际每行数据发生变更的时间,需要执行SQL时手工设置自动更新列值为SYSDATE(),自动更新列的声明中、CURRENT_TIMESTAMP()不能替换为SYSDATE()

DEFAULT 设置

原文:

Use of DEFAULT CURRENT_TIMESTAMP and ON UPDATE CURRENT_TIMESTAMP is specific to TIMESTAMP and DATETIME. The DEFAULT clause also can be used to specify a constant (nonautomatic) default value (for example, DEFAULT 0 or DEFAULT '2000-01-01 00:00:00').

DEFAULT CURRENT_TIMESTAMP为该列设置默认值。

CREATE TABLE t1 (
  ts TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
  dt DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);

DEFAULT后的CURRENT_TIMESTAMP可替换为常量值,如2019-11-20 22:21:00

如果未设置DEFAULT,自动更新仍然生效,只是没有默认值而已。TIMESTAMP的默认值为0、除非声明为NULL才会默认NULL,而DATETIME默认为NULL、设置为NOT NULL时默认值为0.

系统变量explicit_defaults_for_timestamp会影响默认值情况。

为了避免一些不必要的疏忽,建议自动更新列设置DEFAULT CURRENT_TIMESTAMP。

总结

  • 优点: 无需业务代码中实现时间戳,所有的 db操作都会自动记录,便于排查问题。
  • 缺点:数据库服务器和业务服务器可能存在时间差,导致业务变动的时间与数据库时间戳存在差异,会给问题排查带来一定阻碍。 也可以通过校准服务器时间来避免这个问题。

参考资料