gmt_create&gmt_modified如何维护

gmt_create&gmt_modified如何维护

`gmt_create` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',

阿里java开发手册:

【强制】表必备三字段:id, gmt_create, gmt_modified。 
说明:其中 id 必为主键,类型为 bigint unsigned、单表时自增、步长为 1。
gmt_create, gmt_modified 的类型均为 datetime 类型,
前者现在时表示主动创建,后者过去分词表示被动更新。 

这两个字段如何维护:
MySQL 中 DATETIMEDATETIMESTAMP 类型的区别

DATETIME

显示格式:YYYY-MM-DD HH:MM:SS
时间范围:[ '1000-01-01 00:00:00'到'9999-12-31 23:59:59']

DATE

显示格式:YYYY-MM-DD
时间范围:['1000-01-01'到'9999-12-31']

TIMESTAMP

显示格式:YYYY-MM-DD HH:MM:SS
时间范围:[ '1970-01-01 00:00:00'到'2037-12-31 23:59:59']

TIMESTAMP 注意点

TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP  
    在创建新记录和修改现有记录的时候都对这个数据列刷新。
TIMESTAMP DEFAULT CURRENT_TIMESTAMP  
    在创建新记录的时候把这个字段设置为当前时间,但以后修改时,不再刷新它。
TIMESTAMP ON UPDATE CURRENT_TIMESTAMP  
    在创建新记录的时候把这个字段设置为0,以后修改时刷新它。
TIMESTAMP DEFAULT ‘yyyy-mm-dd hh:mm:ss’ ON UPDATE CURRENT_TIMESTAMP  
    在创建新记录的时候把这个字段设置为给定值,以后修改时刷新它

其他注意点:

  • 1、TIMESTAMP列不为空时,默认值可以为0000-00-00 00:00:00,但不能为null。
  • 2、一个表可以存在多个TIMESTAMP列,但一个表只有一个 TIMESTAMP 类型的字段可以在默认值或者 UPDATE 部分用 CURRENT_TIMESTAMP,即设置为数据更新而改变为数据库系统当前值。
    在MySQL 【5.6.5】版本之前,是只能有一列能够在初始化的时候或者被更新的时候自动设置为 CURRENT_TIMESTAMP 的值。
    这个限制在后续版本中取消了,后续版本的MySQL支持任意列被设置为 DEFAULT CURRENT_TIMESTAMP 以及 ON UPDATE CURRENT_TIMESTAMP 时自动更新值。
    MySQL 的 release Note 中也有说明。https://dev.mysql.com/doc/relnotes/mysql/5.6/en/news-5-6-5.html
  • 3、TIMESTAMP 列的默认值是 CURRENT_TIMESTAMP 常量值。当记录数据发生变化的时候,TIMESTAMP 列会自动将其值设定为 CURRENT_TIMESTAMP。
  • 4、TIMESTAMP 列创建后的格式是:
ALTER TABLE `course`
ADD COLUMN `birthday`  timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;
 
ALTER TABLE `course`
ADD COLUMN `birthday`  timestamp NOT NULL DEFAULT '0000-00-00 00:00:00' ON UPDATE CURRENT_TIMESTAMP ;
 
ALTER TABLE `course`
ADD COLUMN `birthday`  timestamp NULL AFTER `cname`;

DATETIME 和 TIMESTAMP 的一些区别和问题

  • DATETIME 的默认值为 null;TIMESTAMP 的字段默认不为空(not null),默认值为当前时间(CURRENT_TIMESTAMP),如果不做特殊处理,并且 update 语句中没有指定该列的更新值,则默认更新为当前时间。
    这个区别就解释了为什么平时我们都不用可以管这个字段就能自动更新了,因为多数时候用的是 timestamp;而此处用的是 datetime,不会有自动更新当前时间的机制,所以需要在上层手动更新该字段
  • DATETIME 使用8字节的存储空间,TIMESTAMP 的存储空间为4字节。因此,TIMESTAMP 比 DATETIME 的空间利用率更高。
    这个区别解释了为啥 timestamp 类型用的多
  • 两者的存储方式不一样 ,对于 TIMESTAMP,它把客户端插入的时间从当前时区转化为UTC(世界标准时间)进行存储。查询时,将其又转化为客户端当前时区进行返回。而对于 DATETIME,不做任何改变,基本上是原样输入和输出。
  • 两者所能存储的时间范围不一样?
    timestamp 所能存储的时间范围为:’1970-01-01 00:00:01.000000’ 到 ‘2038-01-19 03:14:07.999999’;
    datetime 所能存储的时间范围为:’1000-01-01 00:00:00.000000’ 到 ‘9999-12-31 23:59:59.999999’。

CURRENT_TIMESTAMP 为什么能用于 datetime 类型 。select version()。
在mysql 5.6之前的版本,CURRENT_TIMESTAMP 只能用于 timestamp 类型,
【5.6】版本之后,CURRENT_TIMESTAMP 也能用于 datetime 类型了。
select version(); 可查询数据库版本。

如何选用:
DATETIME 和时区无关,TIMESTAMP 与时区有关。更改了数据库的时区,取出的数据会发生改变。
这两个字段做如下设置,前提是 mysql 的版本在 5.6 以上。则数据库会自己维护这两个字段。

`gmt_create` datetime DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
`gmt_modified` datetime DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',

评论

暂无

添加新评论