解决mysql的timestamp的only one current_timestamp限制

  • 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 ;

  • 感想

        mysql,或者说其他很多的开源的软件,由于各种各样的原因,例如资金,例如开发者的眼界(虽然他们技术很好,但可能在商业上的远见还不够),都会存在一些不足。
当我们在使用这些软件的时候,是否会有过想法,去将自己的创意和发现加入它们。 如果有,请珍惜,并且行动。谢谢。

    

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值