阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

PostgreSQL自动更新时间戳

28次阅读
没有评论

共计 1670 个字符,预计需要花费 5 分钟才能阅读完成。

导读 最近有这么一个工程, 需要使用 postgresql 数据库, 在数据库中的好几个表中都需要时间戳这个字段, 这篇文章主要给大家介绍了关于 PostgreSQL 自动更新时间戳的相关资料, 需要的朋友可以参考下
什么是 PostgreSQL 时间戳数据类型?

在 PostgreSQL 中,下一个数据类型是 TIMESTAMP,它可以存储 TIME 和 DATE 值。但它不支持任何 时区数据。这意味着当我们转换数据库服务器的 时区时,时间戳值将存储在数据库中,并且不能重复修改。

在 PostgreSQL 中,TIMESTAMP 数据类型分为 两种时间数据类型,如下:

timestamp

timpstamptz

Timestamp: : 使用时间戳数据类型,不带时区。

Timestamptz: : timestamptz 数据类型用于带有时区的。

注意:

  • timestamptz 数据类型是与时区相关的日期和时间数据类型,并且是具有时区的时间戳。
  • 时间戳和时间戳存储时间戳值的 8 字节存储,如以下命令所示:
SELECT typname, typlen
FROM pg_type
WHERE typname ~ '^timestamp';

最近一段时间公司有一些入职的实习生在使用 PostgreSQL 创建表 Schema 时,对创建时间 create_at 和更新时间 update_at 字段自动更新时间戳不是很清楚。记录这篇文章,让后面来的实习生和新同事有一个参考。

一、为什么

在讲如何更新时间戳之前,我们还是要了解为何有必要自动更新时间戳。对于很多业务表,我们大多数需要记录以下几个字段:

  • create_at 创建时间
  • update_at 更新时间
  • create_by 创建人
  • update_by 更新人

为了给这些字段赋值,我们需要在 repository 层为 entity 赋值,创建时间和更新时间就取当前系统时间 LocalDateTime, 创建人和更新人需要用系统用户去赋值。对于创建时间和更新时间,这种与当前业务无关的字段,有没有可能不在 repository 上每次去手动赋值。

当然,肯定是有的,创建时间无非就是数据新插入行的时间,更新时间就是行数据更新的时间,理解了这一层的含义,那就有解决办法了。

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

二、如何做

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

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

为 create_at 字段设置一个默认值 current_timestamp 当前时间戳,这样达到了通过在 INSERT 语句中提供值来显式地覆盖该列的值。

但上面的这种方式只是对于 insert 行数据的时候管用,如果对行更新的时候,我们需要使用到数据库的触发器 trigger。

首先我们编写一个触发器 update_modified_column 如下面的代码所示,含义是更新表的字段 update_at 为当前时间戳。

CREATE OR REPLACE FUNCTION update_modified_column()
RETURNS TRIGGER AS $$
BEGIN
    NEW.update_at = now();
    RETURN NEW;
END;
$$ language 'plpgsql';

然后我们应用这个触发器,如何应用呢?当然是为这个触发器设置触发条件。

CREATE TRIGGER update_table_name_update_at BEFORE UPDATE ON table_name FOR EACH ROW EXECUTE PROCEDURE  update_modified_column();

即代表的含义是更新表 table_name 行数据的时候,执行这个触发器,我们需要为每一个表设置应用这个触发器!至此,达到目的。

阿里云 2 核 2G 服务器 3M 带宽 61 元 1 年,有高配

腾讯云新客低至 82 元 / 年,老客户 99 元 / 年

代金券:在阿里云专用满减优惠券

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2024-07-25发表,共计1670字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中