我们在设计表时,通常为了记录数据插入和更新的时间,会定义两个字段,create_time/insert_time和update_time,按照需求,记录插入的时间,会存储到create_time/insert_time字段中,记录更新的时间,会存储到update_time字段中,当创建记录时,会同步更新create_time/insert_time和update_time,然而,当更新记录时,只会更新update_time字段。
虽然我们的工程中设置了这两个字段,但是更新记录时,很可能就发现create_time/insert_time和update_time都做了更新,和实际是相反的。
原因可能就是在代码中没有对时间进行显性地设置,而且对时间的维护是MySQL自身进行管理的,例如,
create table test (
id bigint not null auto_increment comment '主键自增',
...
create_time timestamp not null default current_timestamp comment '创建记录时间戳',
update_time timestamp not null default current_timestamp comment '更新记录时间戳',
primary key (id)
);
通过SQL,我们看到create_time和update_time设置的都是DEFAULT CURRENT_TIMESTAMP,因此不管是新创建的记录,还是更新原有的记录,只要是有触发的操作,这两个时间就会被同步修改。
要达到预期效果,就需要改这个了。
解决方案:
将update_time的DEFAULT CURRENT_TIMESTAMP后面再加上条件限制 ON UPDATE CURRENT_TIMESTAMP,这样在更新记录时,只有更新时间被修改,创建时间就是最初创建记录的时间。
MySQL中的CURRENT_TIMESTAMP:
在创建时间字段的时候,
(1) DEFAULT CURRENT_TIMESTAMP
表示当插入数据的时候,该字段默认值为当前时间。
(2) ON UPDATE CURRENT_TIMESTAMP
表示每次更新这条数据的时候,该字段都会更新成当前时间。
这两个操作是MySQL数据库本身在维护,因此就可以根据这个特性来生成"创建时间"和"更新时间"两个字段,不需要代码来维护。
例如,
create table test (
id bigint not null auto_increment comment '主键自增',
...
create_time timestamp not null default current_timestamp comment '创建记录时间戳',
update_time timestamp not null default current_timestamp on update current_timestamp comment '更新记录时间戳',
primary key (id)
);
近期更新的文章:
《最近碰到的一些问题》
《磁盘空间分配的初次尝试》
《Oracle的online index rebuild》
《TiDB沙箱环境初体验》
《最近碰到的一些问题》
近期的热文:
《"红警"游戏开源代码带给我们的震撼》
文章分类和索引:
《公众号1000篇文章分类和索引》