PostgreSQL的扩展moddatetime

PostgreSQL的扩展moddatetime

moddatetime 是 PostgreSQL 的一个内置扩展,用于自动维护表的最后修改时间字段。这个扩展可以自动更新指定字段为当前时间戳,非常适合需要跟踪记录最后修改时间的应用场景。

一、moddatetime 基本功能

核心特性

  • 自动更新时间戳:当行数据被更新时自动设置指定字段为当前时间
  • 触发器实现:基于 PostgreSQL 的触发器机制
  • 轻量级:作为 contrib 模块,不引入额外开销

二、安装与启用

1. 安装扩展

-- 连接到目标数据库后执行
CREATE EXTENSION IF NOT EXISTS moddatetime;

2. 验证安装

-- 检查已安装扩展
SELECT * FROM pg_extension WHERE extname = 'moddatetime';-- 查看扩展函数
\df moddatetime()

三、基本使用方法

1. 创建带有时间戳字段的表

CREATE TABLE documents (id SERIAL PRIMARY KEY,title VARCHAR(255) NOT NULL,content TEXT,created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,modified_at TIMESTAMP  -- 这个字段将由moddatetime自动维护
);

2. 创建触发器

-- 设置modified_at字段自动更新
CREATE TRIGGER update_document_modtime
BEFORE UPDATE ON documents
FOR EACH ROW
EXECUTE FUNCTION moddatetime(modified_at);

四、高级用法示例

1. 多字段自动更新

-- 如果需要同时维护created_at和modified_at
CREATE OR REPLACE FUNCTION update_timestamps()
RETURNS TRIGGER AS $$
BEGINIF TG_OP = 'INSERT' THENNEW.created_at = NOW();NEW.modified_at = NOW();ELSIF TG_OP = 'UPDATE' THENNEW.modified_at = NOW();END IF;RETURN NEW;
END;
$$ LANGUAGE plpgsql;CREATE TRIGGER trg_update_timestamps
BEFORE INSERT OR UPDATE ON documents
FOR EACH ROW
EXECUTE FUNCTION update_timestamps();

2. 条件性更新时间戳

-- 只在特定列变更时更新时间戳
CREATE OR REPLACE FUNCTION conditional_moddatetime()
RETURNS TRIGGER AS $$
BEGINIF NEW.content IS DISTINCT FROM OLD.content OR NEW.title IS DISTINCT FROM OLD.title THENNEW.modified_at = NOW();END IF;RETURN NEW;
END;
$$ LANGUAGE plpgsql;CREATE TRIGGER trg_conditional_modtime
BEFORE UPDATE ON documents
FOR EACH ROW
EXECUTE FUNCTION conditional_moddatetime();

五、实际应用场景

1. 审计日志辅助

-- 结合审计表记录完整修改历史
CREATE TABLE document_audit (audit_id BIGSERIAL PRIMARY KEY,operation CHAR(1) NOT NULL,document_id INT NOT NULL,changed_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,old_data JSONB,new_data JSONB
);CREATE OR REPLACE FUNCTION log_document_changes()
RETURNS TRIGGER AS $$
BEGINIF TG_OP = 'UPDATE' THENINSERT INTO document_audit(operation, document_id, old_data, new_data)VALUES ('U', OLD.id, to_jsonb(OLD), to_jsonb(NEW));ELSIF TG_OP = 'DELETE' THENINSERT INTO document_audit(operation, document_id, old_data)VALUES ('D', OLD.id, to_jsonb(OLD));ELSIF TG_OP = 'INSERT' THENINSERT INTO document_audit(operation, document_id, new_data)VALUES ('I', NEW.id, to_jsonb(NEW));END IF;RETURN NULL;
END;
$$ LANGUAGE plpgsql;CREATE TRIGGER trg_document_audit
AFTER INSERT OR UPDATE OR DELETE ON documents
FOR EACH ROW
EXECUTE FUNCTION log_document_changes();

2. 多租户系统中的应用

CREATE TABLE tenant_records (id BIGSERIAL PRIMARY KEY,tenant_id INT NOT NULL,record_data JSONB NOT NULL,created_by INT NOT NULL,created_at TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP,updated_by INT,updated_at TIMESTAMP,FOREIGN KEY (tenant_id) REFERENCES tenants(id)
);CREATE OR REPLACE FUNCTION update_tenant_record_meta()
RETURNS TRIGGER AS $$
BEGINIF TG_OP = 'INSERT' THENNEW.created_at = NOW();ELSIF TG_OP = 'UPDATE' THENNEW.updated_at = NOW();NEW.updated_by = current_setting('app.current_user_id')::INT;END IF;RETURN NEW;
END;
$$ LANGUAGE plpgsql;CREATE TRIGGER trg_tenant_record_meta
BEFORE INSERT OR UPDATE ON tenant_records
FOR EACH ROW
EXECUTE FUNCTION update_tenant_record_meta();

六、性能考虑与优化

1. 触发器开销分析

  • 每个表的 UPDATE 操作都会触发触发器执行
  • 在频繁更新的表上可能影响性能
  • 建议对高负载表进行性能测试

2. 批量操作处理

-- 批量更新时临时禁用触发器
ALTER TABLE documents DISABLE TRIGGER update_document_modtime;-- 执行批量更新操作
UPDATE documents SET content = content || '\nUpdated' 
WHERE id BETWEEN 1000 AND 2000;-- 手动设置修改时间并重新启用触发器
UPDATE documents SET modified_at = NOW() 
WHERE id BETWEEN 1000 AND 2000 AND modified_at IS NULL;ALTER TABLE documents ENABLE TRIGGER update_document_modtime;

七、与其他方法的比较

方法优点缺点
moddatetime 扩展简单易用,标准化功能较基础
自定义触发器高度灵活,可定制逻辑需要自行维护代码
应用层控制业务逻辑可见容易遗漏更新
监听逻辑解码不侵入业务代码配置复杂,延迟较高

八、最佳实践建议

  1. 命名规范

    • 使用一致的字段名如 created_atupdated_at
    • 触发器名称包含表名和用途,如 trg_[table]_update_time
  2. 文档记录

    COMMENT ON TRIGGER update_document_modtime ON documents IS 
    '自动维护modified_at字段,记录最后更新时间';
    
  3. 测试策略

    • 验证触发器在并发更新时的行为
    • 检查批量操作时的性能影响
  4. 监控维护

    -- 检查所有使用moddatetime的表
    SELECT tgname, tgrelid::regclass 
    FROM pg_trigger 
    WHERE tgname LIKE '%modtime%';
    

moddatetime 是PostgreSQL中维护最后修改时间的轻量级解决方案,特别适合需要简单可靠地跟踪记录变更时间的应用场景。对于更复杂的需求,可以考虑结合自定义触发器或专门的审计解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/news/909292.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

自己的电脑搭建外网访问网站服务器的步骤

文章目录 PC电脑做网站服务器的步骤1.前言2. 网站服务器系统的安装2.1个人电脑安装IIS(Windows7系统安装IIS7.0)2.1.1:打开控制面板,给Windows安装插件 2.2网站配置:2.2.1打开网站配置项:2.2.2开始配置&…

基于深度学习的智能语音合成系统:技术与实践

前言 随着人工智能技术的飞速发展,智能语音合成(Text-to-Speech, TTS)技术已经成为人机交互领域的重要组成部分。从智能助手到有声读物,语音合成技术正在改变我们与数字内容的交互方式。近年来,深度学习技术为语音合成…

铸铁平台的制造工艺复杂而精细

铸铁平台的制造工艺确实复杂而精细。首先,需要选择合适的铸铁材料,通常是灰铸铁或球墨铸铁,以满足平台的强度和耐磨性要求。然后,根据设计要求,制作模具,并在高温下将铁液倒入模具中进行铸造。在铸造过程中…

ArcPy 与 ArcGIS .NET SDK 读取 GDB 要素类坐标系失败?GDAL 外挂方案详解

ArcPy 与 ArcGIS .NET SDK 读取 GDB 要素类坐标系失败?GDAL 外挂方案详解 在ArcGIS Pro中正常显示的坐标系,为何通过ArcPy或.NET SDK却无法正确读取?本文将分享我在处理CGCS2000坐标系时的踩坑经历,以及最终通过GDAL外挂方案解决问…

Zabbix 高可用架构部署方案(2最新版)

Zabbix 高可用架构部署方案(MySQL 双 VIPHAProxyNginx) 前景提要:使用 MySQL 作为数据库,两个虚拟 IP(10.0.0.100 和 10.0.0.200),HAProxy 作为数据库负载均衡,Nginx 作为 Web 访问…

深入解析Linux分页机制:从虚拟内存到物理地址的魔法转换

目录 引言:为什么需要分页机制? 一、分页机制基础概念 1.1 虚拟地址与物理地址 1.2 页与页框 1.3 为什么是4KB? 二、多级页表结构 2.1 为什么需要多级页表? 2.2 x86_64的四级页表结构 2.3 页表项详解 三、Linux分页实现机…

使用python进行图像处理—图像变换(6)

图像变换是指改变图像的几何形状或空间位置的操作。常见的几何变换包括平移、旋转、缩放、剪切(shear)以及更复杂的仿射变换和透视变换。这些变换在图像配准、图像校正、创建特效等场景中非常有用。 6.1仿射变换(Affine Transformation) 仿射变换是一种…

NLP-数据集介绍(并不全,文本类介绍)

目录 第一章 STS(语义文本相似度) (重点)一、SemEval STS 年度任务(2012-2017)1. SemEval-2012 STS2. SemEval-2013 STS3. SemEval-2014 STS4. SemEval-2015 STS5. SemEval-2016 STS6. SemEval-2017 STS 二…

JS进阶 Day01

1.作用域和作用域链 let不可访问 var可访问,因为没有块作用域这一说法 2.JS垃圾回收机制以及算法 下图如上图同理 下图这个三个相互引用的,根部找不到,就进行清除。 3.JS闭包 4.变量和函数提升(了解) 5.函数剩余参数和展开运算符 还有种写法 …

详解Python当中的pip常用命令

想象一下,如果建造房屋时,每一块砖、每一根钢筋都需要你自己亲手烧制和打造,那会是怎样一番景象?软件开发也是如此。如果没有现成的、高质量的、可复用的代码库,开发者们就不得不重复“发明轮子”,效率低下…

LangChain面试内容整理-知识点10:文本嵌入模型(Embeddings)使用

文本嵌入(Embeddings)是将文字转换为向量(高维数值向量)的过程和结果。在LangChain中,Embeddings模块负责调用各种嵌入模型,将文本转化为向量表示,以便后续在向量空间执行相似度搜索、聚类等操作。这在实现语义搜索、RAG中非常关键,因为向量可以让计算机“理解”文本语…

To be or Not to be, That‘s a Token——论文阅读笔记——Beyond the 80/20 Rule和R2R

本周又在同一方向上刷到两篇文章,可以说,……同学们确实卷啊,要不卷卷开放场域的推理呢? 这两篇都在讲:如何巧妙的利用带有分支能力的token来提高推理性能或效率的。 第一篇叫 Beyond the 80/20 Rule: High-Entropy Mi…

bisheng系列(三)- 本地部署(后端 1.2版本)

一、导读 环境:Ubuntu 24.04、open Euler 23.03、Windows 11、WSL 2、Python 3.10 、bisheng 1.2.0 背景:需要bisheng二开商用,故而此处进行本地部署,便于后期调试开发 时间:20250612 说明:bisheng的1.2…

使用 PolarProxy+Proxifier 解密 TLS 流量

一、简介 在分析恶意样本或加密流量时,我们常常需要将 TLS 加密通信还原为明文。 本文介绍如何通过 PolarProxy 和Proxifier 解密 TLS 流量并保存为 pcap 文件,在 Wireshark 中进行进一步分析。 二、工具准备 ✅ PolarProxy(推荐 Windows x64 版本)✅ Proxifier(强制非浏…

[技术积累]成熟的前端和后端开发框架

1、后端 1.1、低代码开发框架 1.1.1、jeecg 官网:JEECG技术论坛 - 基于BPM的低代码开发平台 1.1.2、APIJSON github官网地址:https://github.com/APIJSON gitee官网地址:https://gitee.com/Tencent/APIJSON 官网地址:腾讯AP…

产品升级 | 新一代高性能数据采集平台BRICK2 X11,助力ADAS与自动驾驶开发

随着ADAS(高级驾驶辅助系统)和自动驾驶(AD)开发中对数据采集与处理的需求日益增长,高性能硬件的重要性愈发凸显。 为此,康谋正式发布了其BRICK系列的最新产品——BRICK2 X11,作为BRICK2的直接升…

蚂蚁集团法人变更:韩歆毅接任,公司治理的正常安排

企查查APP显示,6月11日,蚂蚁科技集团股份有限公司发生工商变更,井贤栋卸任法定代表人,由韩歆毅接任。同时,韩歆毅由董事、总经理变更为执行公司事务的董事、总经理。目前,井贤栋仍担任该公司董事长职务。 接…

2025虚幻游戏逆向工程解包尝试

2025虚幻游戏逆向工程解包 前言 在2025游戏模型提取攻略写了,但是想要找的时候又忘了在哪篇文章中写的,所以干脆专门写一下。中间有许多坑。 一坑接一坑。 先说结论:用Umodel(UV Viewer)查看和导出模型。FModel虽然…

Qt学习及使用_第1部分_认识Qt---Qt开发基本流程

前言 学以致用,通过QT框架的学习,一边实践,一边探索编程的方方面面. 参考书:<Qt 6 C开发指南>(以下称"本书") 标识说明:概念用粗体倾斜.重点内容用(加粗黑体)---重点内容(红字)---重点内容(加粗红字), 本书原话内容用深蓝色标识,比较重要的内容用加粗倾…

大模型的开发应用(十):对话风格微调项目(上):数据工程与模型选型

数据工程 1 项目介绍2 数据工程2.1 申请 API Key 并测试2.2 文本嵌入模型2.3 生成训练集2.3.1 制作风格模板2.3.2 调用大模型获取数据2.3.3 对大模型生成的数据进行质量过滤2.3.4 程序入口 2.4 数据转换 3 模型选型3.1 候选模型与评估数据集3.2 模型评估 附录&#xff08;对比不…