PostgreSQL自动更新时间戳实例代码


Posted in PostgreSQL onNovember 27, 2021

什么是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行数据的时候,执行这个触发器,我们需要为每一个表设置应用这个触发器!至此,达到目的。

总结

到此这篇关于PostgreSQL自动更新时间戳的文章就介绍到这了,更多相关PostgreSQL自动更新时间戳内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

PostgreSQL 相关文章推荐
PostgreSQL存储过程实用脚本(二):创建函数入门
Apr 05 PostgreSQL
自定义函数实现单词排序并运用于PostgreSQL(实现代码)
Apr 22 PostgreSQL
PostgreSQL通过oracle_fdw访问Oracle数据的实现步骤
May 21 PostgreSQL
如何使用PostgreSQL进行中文全文检索
May 27 PostgreSQL
postgresql 删除重复数据案例详解
Aug 02 PostgreSQL
基于PostgreSQL/openGauss 的分布式数据库解决方案
Dec 06 PostgreSQL
PostgreSQL事务回卷实战案例详析
Mar 25 PostgreSQL
PostgreSQL基于pgrouting的路径规划处理方法
Apr 18 PostgreSQL
PostgreSQL出现死锁该如何解决
May 30 PostgreSQL
PostgreSQL常用字符串分割函数整理汇总
Jul 07 PostgreSQL
关于PostgreSQL JSONB的匹配和交集问题
Sep 14 #PostgreSQL
postgresql 删除重复数据案例详解
Aug 02 #PostgreSQL
PostgreSQL解析URL的方法
Aug 02 #PostgreSQL
postgresql使用filter进行多维度聚合的解决方法
Jul 16 #PostgreSQL
浅谈PostgreSQL表分区的三种方式
通过Qt连接OpenGauss数据库的详细教程
postgres之jsonb属性的使用操作
Jun 23 #PostgreSQL
You might like
PHP获取数组中某元素的位置及array_keys函数应用
2013/01/29 PHP
Laravel框架使用Seeder实现自动填充数据功能
2018/06/13 PHP
PHP实现对数字分隔加千分号的方法
2019/03/18 PHP
Javascript typeof 用法
2008/12/28 Javascript
引用 js在IE与FF之间的区别详细解析
2013/11/20 Javascript
jQuery实现文件上传进度条特效
2015/08/12 Javascript
javascript中html字符串转化为jquery dom对象的方法
2015/08/27 Javascript
Angularjs 实现一个幻灯片示例代码
2016/09/08 Javascript
一步一步封装自己的HtmlHelper组件BootstrapHelper(二)
2016/09/14 Javascript
js实现背景图自适应窗口大小
2017/01/10 Javascript
用jQuery旋转插件jqueryrotate制作转盘抽奖
2017/02/10 Javascript
vue快捷键与基础指令详解
2017/06/01 Javascript
JS实现提交表单前的数字及邮箱校检功能
2017/11/13 Javascript
node(koa2) web应用模块介绍详解
2019/03/29 Javascript
vue组件库的在线主题编辑器的实现思路
2020/04/03 Javascript
js HTML DOM EventListener功能与用法实例分析
2020/04/27 Javascript
jQuery实现开关灯效果
2020/08/02 jQuery
Python中的hypot()方法使用简介
2015/05/18 Python
Python编程之string相关操作实例详解
2017/07/22 Python
Python中int()函数的用法浅析
2017/10/17 Python
python sklearn库实现简单逻辑回归的实例代码
2019/07/01 Python
Python3 全自动更新已安装的模块实现
2020/01/06 Python
Pytest mark使用实例及原理解析
2020/02/22 Python
详解PyQt5信号与槽的几种高级玩法
2020/03/24 Python
Python 下载Bing壁纸的示例
2020/09/29 Python
The Hut美国/加拿大:英国领先的豪华在线百货商店
2019/03/26 全球购物
通用C#笔试题附答案
2016/11/26 面试题
高一物理教学反思
2014/01/24 职场文书
酒店总经理助理职责
2014/02/12 职场文书
学校爱心捐款倡议书
2014/05/13 职场文书
公务员爱岗敬业演讲稿
2014/08/26 职场文书
全国优秀教师事迹材料
2014/08/26 职场文书
2014年稽查工作总结
2014/12/20 职场文书
2015年青年教师工作总结
2015/05/25 职场文书
关于python类SortedList详解
2021/09/04 Python
MySQL控制流函数(-if ,elseif,else,case...when)
2022/07/07 MySQL