「这是我参与2022首次更文挑战的第4天,活动详情查看:2022首次更文挑战」
在做业务的时候,有经常需要修改时间字段, 为了避免在业务中设置时间字段,可以利用 MySQL 的 ON 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操作都会自动记录,便于排查问题。
- 缺点:数据库服务器和业务服务器可能存在时间差,导致业务变动的时间与数据库时间戳存在差异,会给问题排查带来一定阻碍。 也可以通过校准服务器时间来避免这个问题。