发布时间:2026/9/7 0:49:08
从0到1构建PostgreSQL时态表:temporal_tables完整示例教程 从0到1构建PostgreSQL时态表temporal_tables完整示例教程【免费下载链接】temporal_tablesPostgresql temporal_tables extension in PL/pgSQL, without the need for external c extension.项目地址: https://gitcode.com/gh_mirrors/tem/temporal_tablesPostgreSQL时态表temporal tables是一种特殊的数据库表结构能够记录数据随时间变化的完整历史。temporal_tables项目提供了一个纯PL/pgSQL实现的解决方案无需依赖外部C扩展特别适合AWS RDS、Google Cloud SQL和Azure Database for PostgreSQL等云环境使用。本文将通过实际示例带您快速掌握时态表的创建与应用。为什么选择temporal_tablestemporal_tables扩展具有以下核心优势纯SQL实现采用PL/pgSQL编写无需编译C扩展可直接在托管PostgreSQL环境中使用性能优化提供两种版本函数完整版versioning_function.sql包含完整验证versioning_function_nochecks.sql则通过移除检查实现2倍性能提升丰富功能支持忽略无变化更新、历史表包含当前版本、自动版本号递增等高级特性兼容性好与原生PostgreSQL语法兼容学习成本低快速开始环境准备首先克隆项目仓库到本地git clone https://gitcode.com/gh_mirrors/tem/temporal_tables cd temporal_tables创建测试数据库并安装时态表函数createdb temporal_test psql temporal_test versioning_function.sql如果需要使用自定义系统时间功能还需安装系统时间函数psql temporal_test system_time_function.sql实战教程创建你的第一个时态表1. 创建基础表结构以订阅信息表为例首先创建基础表结构CREATE TABLE subscriptions ( name text NOT NULL, state text NOT NULL );2. 添加系统时间列时态表需要一个特殊的时间区间列来记录数据有效性ALTER TABLE subscriptions ADD COLUMN sys_period tstzrange NOT NULL DEFAULT tstzrange(current_timestamp, null);3. 创建历史表历史表将存储所有数据变更记录使用LIKE语法复制基础表结构CREATE TABLE subscriptions_history (LIKE subscriptions);为提高查询性能建议为历史表添加索引CREATE INDEX ON subscriptions_history (sys_period); -- 如果表有唯一标识列也建议添加索引 -- CREATE INDEX ON subscriptions_history (id);4. 创建版本控制触发器触发器是实现时态表功能的核心它会在数据变更时自动维护历史记录CREATE TRIGGER versioning_trigger BEFORE INSERT OR UPDATE OR DELETE ON subscriptions FOR EACH ROW EXECUTE PROCEDURE versioning( sys_period, subscriptions_history, true );基本操作体验时态表功能完成上述配置后我们可以通过简单操作体验时态表的强大功能-- 插入测试数据 INSERT INTO subscriptions (name, state) VALUES (test1, inserted); -- 更新数据 UPDATE subscriptions SET state updated WHERE name test1; UPDATE subscriptions SET state updated twice WHERE name test1; -- 删除数据 DELETE FROM subscriptions WHERE name test1;查询当前表会发现数据已被删除SELECT * FROM subscriptions; -- 返回0行但查询历史表可以看到完整的变更记录SELECT * FROM subscriptions_history;结果类似namestatesys_periodtest1inserted[2017-08-01 16:09:45.54298302,2017-08-01 16:09:54.98417902)test1updated[2017-08-01 16:09:54.98417902,2017-08-01 16:10:08.88057102)test1updated twice[2017-08-01 16:10:08.88057102,2017-08-01 16:10:17.3365902)高级功能定制你的时态表设置自定义系统时间temporal_tables提供了set_system_time函数允许您设置自定义时间戳这在数据迁移和历史数据补录时非常有用-- 设置自定义系统时间 SELECT set_system_time(1999-12-31 23:59:59::timestamptz); -- 插入数据将使用指定的时间戳 INSERT INTO subscriptions (name, state) VALUES (test2, inserted); -- 重置为默认系统时间 SELECT set_system_time(null);忽略无变化更新默认情况下即使更新前后数据没有变化时态表也会记录历史。通过添加第四个参数可以只记录实际发生变化的更新CREATE TRIGGER versioning_trigger BEFORE INSERT OR UPDATE OR DELETE ON subscriptions FOR EACH ROW EXECUTE PROCEDURE versioning( sys_period, subscriptions_history, true, true );历史表包含当前版本默认历史表只存储历史数据通过第五个参数可以让历史表同时包含当前版本数据简化查询操作CREATE TRIGGER versioning_trigger BEFORE INSERT OR UPDATE OR DELETE ON subscriptions FOR EACH ROW EXECUTE PROCEDURE versioning( sys_period, subscriptions_history, true, false, true );启用后可以直接从历史表查询所有版本包括当前版本SELECT * FROM subscriptions_history WHERE name test1;而不必像以前那样联合查询当前表和历史表-- 启用前需要这样查询 SELECT * FROM subscriptions WHERE name test1 UNION SELECT * FROM subscriptions_history WHERE name test1;自动版本号递增您可以为表添加版本号列实现每次更新自动递增版本号-- 添加版本号列 ALTER TABLE subscriptions ADD COLUMN version int NOT NULL DEFAULT 1; ALTER TABLE subscriptions_history ADD COLUMN version int NOT NULL; -- 创建带版本号功能的触发器 CREATE TRIGGER versioning_trigger BEFORE INSERT OR UPDATE OR DELETE ON subscriptions FOR EACH ROW EXECUTE PROCEDURE versioning( sys_period, subscriptions_history, false, false, false, false, true, -- 启用版本号递增 version -- 版本号列名 );迁移现有表到时态表如果您需要将现有表转换为时态表可以按照以下步骤操作添加系统时间列ALTER TABLE existing_table ADD COLUMN sys_period tstzrange NOT NULL DEFAULT tstzrange(current_timestamp, null);创建历史表CREATE TABLE existing_table_history (LIKE existing_table);复制当前数据到历史表INSERT INTO existing_table_history SELECT *, tstzrange(LOWER(sys_period), NULL) FROM existing_table;创建触发器CREATE TRIGGER versioning_trigger BEFORE INSERT OR UPDATE OR DELETE ON existing_table FOR EACH ROW EXECUTE PROCEDURE versioning( sys_period, existing_table_history, true, false, true );性能优化建议选择合适的版本函数对性能要求高且能接受较少验证的场景可使用versioning_function_nochecks.sql合理设计索引至少为历史表的sys_period列创建索引定期清理历史数据对于不再需要的历史数据可考虑归档或删除批量操作优化大批量数据操作时可暂时禁用触发器完成后重新启用并手动处理历史记录测试与验证项目提供了完整的测试套件您可以通过以下命令运行测试# 启动测试数据库 npm run db:start # 运行测试 npm test # 或使用make make run_test性能测试可以通过以下命令执行make performance_test总结temporal_tables提供了一个简单而强大的解决方案让您无需复杂配置即可在PostgreSQL中实现时态数据管理。通过本文介绍的步骤您可以快速创建和使用时态表有效跟踪数据变更历史满足合规性和审计需求。无论是新应用开发还是现有系统改造temporal_tables都是管理时间序列数据的理想选择。项目的所有功能实现都可以在以下文件中找到详细代码核心版本控制函数versioning_function.sql系统时间函数system_time_function.sql测试用例test/sql/【免费下载链接】temporal_tablesPostgresql temporal_tables extension in PL/pgSQL, without the need for external c extension.项目地址: https://gitcode.com/gh_mirrors/tem/temporal_tables创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

2026/9/6 6:18:36

基于流体力学复习数学:积分

1 积分的定义积分(integral)包括不定积分(indefinite integral)和定积分(definite integral)两类。1.1 不定积分不定积分为求导的逆过程。其中,F(x) 称为 f(x) 的原函数,f(x) 称为被…

2026/9/5 15:14:33

【observability】【evaluation23】多模态RAG评估案例分析

案例目标本案例演示如何评估一个多模态RAG(Retrieval-Augmented Generation)系统。与纯文本案例类似,我们分别考虑对检索器(Retriever)和生成器(Generator)的评估。具体来说,本案例使用美国手语(ASL)字母表图像和文本描述作为多模态数据,构建…

2026/9/7 4:43:53

机器学习异常值检测与处理:从IQR到孤立森林的完整指南

我在实际做机器学习项目时,最怕的不是模型训练时间太长,而是数据清洗阶段漏掉了异常值。几个极端样本看起来不影响大局,却能让均值失效、让线性回归系数明显偏移、让聚类结果面目全非。异常值,也叫离群点,简单理解就是…

2026/9/7 4:43:53

磐镭/小影霸GTX1080专用驱动441.66安装指南与故障排查

简介:磐镭或小影霸1080显卡用户现在可获得官方最新专用驱动441.66,该版本基于英伟达技术更新,重点解决显卡在运行新游戏和图形软件时的兼容性问题,同时优化性能、系统稳定性与安全性,对游戏场景切换、图形渲染效率和新…

2026/9/7 4:43:53

美的熊墩墩Pro冰箱实测:超薄嵌入、双系统2.0与除菌升级全解析

这次我们来看一台大件家电:美的熊墩墩Pro,一台600L法式四开门冰箱。标题信息里直接点出的重点是超薄嵌入式、双系统2.0和除菌升级,这几个词基本把当前中高端冰箱的技术路线概括完了:容量要大、嵌入要薄、控温要分系统、除菌要跟上…

2026/9/7 4:43:53

.NET诊断专家:从报错到根因的实战排查指南

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/9/7 4:38:53

Milstein方法全解析:从随机微分方程到线代学习

简介:面向随机微分方程与常微分方程数值求解的Milstein方法MATLAB实现,特别适合金融数学、生物物理及随机动力系统模拟方向的科研与工程人员参考。该方法基于Ito积分理论,在Euler-Maruyama方法基础上引入二阶导数项,将SDE离散化后…

2026/9/7 0:47:43

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/7 0:14:19

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/7 0:14:17

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/7 0:03:36

基于YOLOv8和PyQt5的麦穗稻穗检测识别系统设计与实现

这次我们来看一个把目标检测算法和桌面端工具结合得很典型的项目:基于 YOLOv8 PyQt5 的麦穗稻穗检测识别系统。这个项目本身不是新概念,但它的价值在于落地形态很完整。YOLOv8 负责核心的麦穗稻穗目标检测,PyQt5 负责提供可视化的桌面交互界…

2026/9/7 0:03:36

UL 1642锂电池安全标准全解析:测试项目、认证流程与避坑指南

简介:UL 1642是锂电池安全领域的重要规范,本中文版资源适合锂电池制造商、检测机构工程师及产品认证相关人员阅读,用于理解电池在设计与制造层面的安全要求、测试方法与合规要点。资源共1个PDF文件,压缩包大小834KB,便…

2026/9/7 0:03:36

BS EN 13814-1-2019游乐设施安全标准:设计与制造核心要点解析

简介:BS EN 13814-1:2019是英国采纳欧洲标准EN 13814-1:2019的正式版本,由BSI标准出版,重点规定游乐设施和游乐设备在设计与制造环节的安全准则,与BS EN 13814-2:2019、BS EN 13814-3:2019共同取代旧版BS EN 13814:2004。该标准面…

2026/9/6 11:40:10

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/6 19:33:50

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/6 10:19:40

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…