PostgreSQL表层级时间自动更新

一、实现思路

对于很多业务表,最常用以下几个字段:创建时间(create_at) 、更新时间(update_at)、创建人 (create_by)、更新人(update_by)通常在业务上有两种更新方式:

  1. 通过实现HandlerInterceptor自定义拦截器获用户信息和当前时间,在持久层对公共实体类进行统一更新保存
  2. 在数据库层级更新公共字段,但只仅限于时间这里不能实现用户信息的更新

对于MySQL来说,其内部提供的函数对于创建时间和更新时间的字段的自动更新是相当容易的,但对于PostgreSQL事情会稍稍复杂一点。

二、实现步骤

要在插入数据的时候自动填充 create_at列的值,我们可以使用DEFAULT值,如下面所示。

CREATE TABLE users (
  ...
  create_at timestamp(6) default current_timestamp
)

设置create_at字段默认为current_timestamp即当前时间戳,这样可以在 INSERT 语句中自动默认为当前时间戳。以上操作只能实现插入数据更新时间字段,要实现create_at字段自动UPDATE就需借助数据库触发器即Trigger,也可将触发器理解成自定义的SQL函数。

补充:触发器(Trigger)是由事件自动触发执行的一种特殊的存储过程,触发事件可以是对一个表进行INSERT、UPDATE、DELETE等操作。触发器经常用于加强数据的完整性约束和业务规则上的约束等。

-- 创建触发器
CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
	#需要更新字段
    NEW.update_at = now();
    RETURN NEW;
END;
$$ language 'plpgsql';

在这里插入图片描述

触发器该如何使用?上面设置触发器名称为update_modified_column(),对我们需要做时间戳更新操作的表设置相应的触发器即可,只需触发器名称和表明替换。需要给每一个做类似操作的表都增加触发器,因此这种方法适用于小规模,区别于全局更细的特殊逻辑场景。

 -- 设置触发器
CREATE TRIGGER trigger_name BEFORE 
UPDATE ON table_name 
FOR EACH ROW EXECUTE PROCEDURE update_modified_column();

-- 删除触发器
DROP TRIGGER update_table_name_update_at ON sms001_user_info ;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值