PostgreSQL 18 - 时间约束 (Temporal Constraints)

news/2025/11/27 17:30:27/文章来源:https://www.cnblogs.com/ivorysql/p/19278847

PostgreSQL 18 引入了一项强大的新功能,允许你在时间段内强制执行唯一性:时间约束(Temporal Constraints)。通过这一新增功能,你现在可以在定义 UNIQUEPRIMARY KEYFOREIGN KEY 约束时,利用日期范围(Date Range)或时间戳范围(Timestamp Range)字段,比以往更容易地防止数据重叠。

问题所在:基于时间的唯一性

在最新的这个版本中,PostgreSQL 增加了一种更灵活的方式来定义 UNIQUEPRIMARY KEYFOREIGN KEY 约束。我将把示例重点放在 UNIQUE 约束上,因为这在我看来是时间约束最有用的场景。

让我们从一个现实世界的场景开始:管理用户订阅。

设置示例

首先,我们有一个简单的 users 表,包含 2 行数据:

CREATE TABLE users (id uuid DEFAULT uuidv7() PRIMARY KEY,email VARCHAR(100) UNIQUE NOT NULL
);INSERT INTO users (email) VALUES 
('darth@example.com'),
('luke@example.com');

使用 WITHOUT OVERLAPS 的时间约束

现在我想创建一个属于 users 表的 subscriptions(订阅)表。每个订阅都有开始和结束日期,我想确保每个用户的订阅是唯一的。用户可以有过去的订阅(也许他们升级了层级),但在任何给定的时间点只能有一个活跃的订阅。

以下是我们如何使用新的 WITHOUT OVERLAPS 语法来强制执行此操作:

CREATE TABLE subscriptions (user_id uuid NOT NULL,type VARCHAR(50) NOT NULL,valid_period daterange NOT NULL,FOREIGN KEY (user_id) REFERENCES users(id),UNIQUE (user_id, valid_period WITHOUT OVERLAPS)
);

如你所见,我们在 valid_period 这个 daterange 字段的 UNIQUE 约束中使用了 WITHOUT OVERLAPS。时间约束要求键列(valid_period)必须是范围类型(range type),因此通常你会使用 daterangetimestamprange,但它也适用于其他范围类型。

测试一下

让我们插入一些数据:

INSERT INTO subscriptions (user_id, type, valid_period)
SELECT u.id, 'basic', daterange('2024-01-01', '2025-01-01', '[)')
FROM users u;INSERT INTO subscriptions (user_id, type, valid_period)
SELECT u.id, 'premium', daterange('2025-01-01', '2026-01-01', '[)')
FROM users u
WHERE u.email = 'darth@example.com';SELECT * FROM subscriptions;

结果如下:

               user_id                |  type   |      valid_period
--------------------------------------+---------+-------------------------0199f293-291a-70bf-b9ee-872247723d29 | basic   | [2024-01-01,2025-01-01)0199f293-291b-737a-9bd0-e0e0853e3377 | basic   | [2024-01-01,2025-01-01)0199f293-291a-70bf-b9ee-872247723d29 | premium | [2025-01-01,2026-01-01)

在这个例子中,Luke 显然在 2025 年停止了付费,而 Darth 升级到了高级版。我通常习惯使用单独的列来表示开始和结束日期,但我很欣赏范围类型(Ranges)能够启用此功能,并允许我们使用强大的范围运算符。

额外内容:查询活跃订阅

使用“冰淇淋筒”运算符(@>,即包含运算符),我们可以轻松找到特定日期有效的订阅:

SELECT * FROM subscriptions
WHERE valid_period @> '2025-01-01'::date;

这个查询会告诉我们哪些订阅在 2025 年 1 月 1 日是活跃的。

重要提示:GIST 与 B-Tree 索引

有一个陷阱:范围列使用 GIST 索引,而 UUID 列使用 B-Tree 索引。当我运行 CREATE TABLE subscriptions 命令时,我遇到了一个错误。为了解决这个问题,你需要启用以下扩展:

CREATE EXTENSION btree_gist;

了解更多

如果你想深入了解时间约束,请查看 PostgreSQL 文档中关于 WITHOUT OVERLAPS 的部分。

原文链接:https://hashrocket.com/blog/posts/postgresql-18-temporal-constraints

作者:Vinicius Negrisolo

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

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

相关文章

深入解析:Angular【基础语法】

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

微波烘干设备哪家好?国内优质企业及业务解析

微波烘干设备作为一种高效节能的干燥设备,广泛应用于食品、医药、化工、农业等多个领域,其利用微波技术实现快速均匀加热,在提升生产效率的同时降低能耗,成为现代工业生产中不可或缺的关键设备。选择合适的微波烘干…

U635097 有向图

首先考虑 DAG 计数,设 \(f_{s, s}\) 表示目前确定的点集为 \(s\),最后一层点为 \(s\),因为我 DAG 计数按照拓扑序一定是一层层转移的,你会发现这个状态数是 \(O(4^n)\),直接爆炸了。 比较神秘的优化是,去掉 \(s\…

升级Win11专业工作站版密钥

Win11专业工作站版性能极其强大,拥有深度优化的系统内核,充分释放多核处理器与显卡性能。无论大型游戏、专业渲染还是多任务处理,都能稳定高效运行,是追求顶级性能用户的最佳选择。 密钥地址:http://ruan.fun (在…

多线程+asyncio端口扫描器

#!/usr/bin/env python3 """ 多线程+asyncio端口扫描器 结合了异步IO和多线程技术,实现高效的端口扫描功能 """import asyncio import socket import threading import time import ar…

U635735 Treap=Tree+Heap

结论是建出笛卡尔树后每个结点的深度相当于从这个结点向前向后严格前后缀最大值个数,那么路径长度等价于这个,我们只需要快速维护这个即可。 这是单侧递归线段树模板题,使用线段树即可做到 \(O(n \log^2 n)\)。

Docker客户端控制局域网服务器 - a-cool

需求 在局域网内开放Docker服务器的2375端口,让Windows Docker客户端能够远程操作. 注意 以目前这种方式开放2375端口,相当于在没有密码的情况下将你服务器的root权限暴露在局域网中​。 生产环境或对公网开放绝对不…

时序约束记录

快时钟到慢时钟域约束 最近在看xilinx UG903手册,手册中针对快时钟到慢时钟使用multicycle 约束的描述如下:使用如下约束 set_multicycle_path 3 -setup -start -from [get_clocks CLK1] -to [get_clocks CLK2] set_…

U635732 木叶下

求连了一条边后,所有点到这个环的距离最大值。 那么你发现难点其实在于求一个点挖掉一个子树后的答案,对于一条链求这个东西其实并不简单。 一个好做的方法是,我们对于每个结点记录它父亲挖掉它的最大值,这样每个结…

U635734 神机

一个经典结论是图上所有环都可以被简单环组合出来。 那么本题相当于要求一条边必须出现在所有的奇环中并且不能出现在所有的偶环中,使用树上差分求解即可。

2025深圳粉末冶金展机构权威推荐榜单:2025青岛家博会‌/2025深圳跨境电商展‌/2025新加坡海鲜展源头机构精选

在高端制造业转型升级与新材料技术加速迭代的背景下,深圳粉末冶金展览会作为产业链资源整合与创新成果展示的关键平台,其组织水平与资源整合能力直接影响参展成效。据行业数据显示,2025年中国粉末冶金市场规模预计突…

U635730 二叉树

首先发现是一个区间 DP 的形式,那么这些限制就是限制了某些位置不能转移,可以差分一下看哪些位置可以转移。

2025年宽幅等离子清洗机优质厂家权威推荐榜单:真空等离子清洗机/大气等离子清洗机/等离子体清洗机源头厂家精选

宽幅等离子清洗机作为现代制造业表面处理的关键装备,其处理均匀性、稳定性与效率直接关系到电子、半导体、汽车等行业产品的良率与性能。随着精密制造要求的提升,市场对大尺寸、高效率、高稳定性的等离子清洗设备需求…

深入解析:简单、高效且低成本的预训练、微调与服务,惠及大众基于 Ray 架构设计的覆盖大语言模型(LLM)完整生命周期的解决方案byzer-llm

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

CF1985G-D-Function

CF1985G-D-Function 题目大意 \(D(n)\) 表示 \(n\) 的数字之和。对于多少个整数 \(n\) 满足 \(10^l \le n \le 10^r\) 的条件 \(D(k \cdot n)=k \cdot D(n)\) 。输出答案对 \(10^9+7\) 。 \(Hint\) 对于满足条件的 \(…

2025 年义乌礼品定制厂家最新推荐榜,聚焦企业生产能力、服务水平与市场认可度多维度解析定制商务礼品 / 公司礼品定制 / 纪念品定制 / 定制伴手礼 / 企业礼品定制 / 客户礼品定制公司推荐

引言 在企业礼赠、员工福利等场景中,优质礼品定制对传递品牌价值意义重大。本次推荐榜参考国际礼品定制行业协会(International Gift Customization Industry Association)2024 - 2025 年度测评数据,该测评覆盖全球…

U636118 二叉搜索树

列出区间 DP 转移式,打表发现可以四边形不等式优化,于是优化到 \(O(n^2)\)。

2025年口碑好的四川种苗基地排名及采购参考

2025 年口碑好的四川种苗基地排名及采购参考在乡村振兴战略持续推进与中药材产业蓬勃发展的背景下,四川作为全国道地药材核心产区,优质种苗基地成为推动产业升级的关键力量。基于基地规模、资质荣誉、品种资源、服务…

2025 年义乌商务礼品厂家最新推荐榜,全链条能力与定制服务双维度深度解析商务伴手礼/商务礼品网/定制商务礼品/商务福利礼品/商务实用礼品公司推荐

引言 商务礼品作为企业形象传递与情感联结的核心载体,其定制品质与服务效率直接影响礼赠价值的实现。当前市场中,68% 的企业采购者面临产品同质化、定制响应滞后、品质管控缺失等痛点,而具备全链条服务能力的品牌仅…

egacy(传统) nftables(较新) 和后端ipvs iptables有关系吗

核心结论(先说重点):legacy / nftables 是 iptables 工具的两种实现后端(backend),它们属于 Linux 内核 netfilter 框架下的用户态工具接口。 iptables / ipvs 是 kube-proxy 的两种代理模式(proxy mode),用于…