MySQL:实现对数据入库时间和更新时间的管理(timestamp)
MySQL:实现对数据入库时间和更新时间的管理(timestamp)
一. 需求
1、在数据表中,要记录每条数据是什么时候创建的;
2、在数据库中,要记录每条数据是什么时候修改的;
二. 实现详解:timestamp
MySQL常用的版本,包括MySQL 5.5/5.6/5.7三个大版本和N个小版本。 在上述三个大版本中,默认时间戳(Timestamp)类型的取值范围为’1970-01-01 00:00:01’ UTC 至’2038-01-19 03:14:07’ UTC。
在MySQL 5.6.4及之后版本,可以将时间戳类型数据最高精确微秒(百万分之一秒),数据类型定义为timestamp(N),N取值范围为0-6,默认为0,如需要精确到毫秒则设置为Timestamp(3),如需要精确到微秒则设置为timestamp(6),数据精度提高的代价是其内部存储空间的变大,但仍未改变时间戳类型的最小和最大取值范围。
时间戳列可以有四种组合定义,其含义分别为:
1、当字段定义为timestamp,表示该字段在插入和更新时都不会自动设置为当前时间。
2、当字段定义为timestamp DEFAULT CURRENT_TIMESTAMP,表示该字段仅在插入且未指定值时被赋予当前时间,再更新时且未指定值时不做修改。【适合入库字段】
3、当字段定义为timestamp ON UPDATE CURRENT_TIMESTAMP,表示该字段在插入且未指定值时被赋值为"0000-00-00 00:00:00",在更新且未指定值时更新为当前时间。【适合更新字段】
4、当字段定义为timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,表示该字段在插入或更新时未指定值,则被赋值为当前时间。
解释:CURRENT_TIMESTAMP表示使用CURRENT_TIMESTAMP()函数来获取当前时间,类似于NOW()函数。
注意:当MySQL参数time_zone=system时,查询timestamp字段会调用系统时区做时区转换,而由于系统时区存在全局锁问题,在多并发大数据量访问时会导致线程上下文频繁切换,CPU使用率暴涨,系统响应变慢设置假死。所以建议将time_zone参数设置为system外的值,如中国地区服务器设置为’+8:00’。
三. 实现样例
drop table if exists table_timestamp;
create table table_timestamp
(
message_pk bigint not null auto_increment,
message_content varchar(99),
/* 创建时间不可为空*/
CreateTime timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间' ,
/* 更新时间默认为空*/
UpdateTime timestamp NULL DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间' ,
primary key (message_pk)
);
insert into table_timestamp(message_content) values('示例-插入');
select * from table_timestamp;
update table_timestamp set message_content='示例-插入-更新' where message_pk=1;
select * from table_timestamp;