- timestamp简介
mysql中的timestamp是一个很有用的数据类型,以UTC格式存储,读取和写入时根据当前时区设置转化。但是它本身也有一些限制,最出名的当属这个:表中只允许有一个timestamp类型并且默认值为 current_timestamp 的列。这也是很多人认为的mysql的缺陷,或者说短板。
- 突破限制。
突破这个限制的原理很简单,定义一个trigger,让它在适当的时机,将列值设置为current_timestamp。
下面是一个案例,还有一些扯淡。
我之前从事过一段时间的oracle ebs的开发,这个系统的庞大这里就不用说了,内部的表也都很复杂,动不动就是几十上百的列,很多列都是类似created_by,created_time,lastmodified_by,lastmodifiyed_time这样的记录更新历史的列。考虑到它的目标业务(企业级业务管理),拥有这些列是非常必要的。
好了,我们要在mysql中实现这样的功能,表中有两个timestamp类型的列,created_time 插入数据是更新为当前时间,lastmodified_time 插入数据和行内其他列时更新为当前时间。
先创建表:
CREATE TABLE ts(
id INT AUTO_INCREMENT PRIMARY KEY,
title VARCHAR(255) NOT NULL,
created_time TIMESTAMP DEFAULT 0 ,
lastModified_time TIMESTAMP DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP
);
lastModified_time这个列显然已经实现了它的功能:插入数据和行内其他列时更新为当前时间。
接下来我们创建trigger,通过trigger在插入之前设置新行的created_time的值为now。
delimiter $$
CREATE TRIGGER ts_trigger
before INSERT ON ts
FOR EACH ROW
BEGIN
SET new.created_time = NOW();
END;
$$
delimiter ;
- 感想