1. 问题
碰到一个奇怪的问题,一个业务表当更新了其中几行后,这几行对应的列created_at(DATETIME)自动更新为当前时间。
2. 排查
- 第一感觉想到触发器,排查表并未有触发器。
- 打开表设计器,发现其中"更新"列对应created_at打了勾。
3. 分析
3.1 功能
可以自动更新列为当前日期时间,即当前时间戳。
3.2 语法
ON UPDATE CURRENT_TIMESTAMP,可以用于以下类型
- DATETIME
- TIMESTAMP
备注:确认不能用于DATE类型。
用于INT、VARCHAR报出类似以下的错误
错误代码: 1294
Invalid ON UPDATE clause for ‘status’ column
3.2.1 CREATE
CREATE TABLE `test_table` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`remark` VARCHAR(255) DEFAULT NULL COMMENT '备注' ,
`created_at` DATETIME NULL COMMENT '创建时间' ON UPDATE CURRENT_TIMESTAMP,
PRIMARY KEY (`id`)
) ENGINE=INNODB COMMENT='test_table;';
3.2.2 UPDATE
3.2.2.1 删除
ALTER TABLE test_table CHANGE created_at created_at DATETIME NULL COMMENT '创建时间';
3.2.2.2 增加
ALTER TABLE test_table CHANGE created_at created_at DATETIME NULL COMMENT '创建时间' ON UPDATE CURRENT_TIMESTAMP;