首页 > 数据库 > mysql教程 > PostgreSQL 的 EXCLUDE 约束如何防止重叠和相邻的日期/时间范围条目?

PostgreSQL 的 EXCLUDE 约束如何防止重叠和相邻的日期/时间范围条目?

Barbara Streisand
发布: 2025-01-04 00:30:38
原创
955 人浏览过

How Can PostgreSQL's EXCLUDE Constraint Prevent Overlapping and Adjacent Date/Time Range Entries?

在 PostgreSQL 中使用 EXCLUDE 防止相邻/重叠条目

问题:

创建数据库存储任意日期/时间范围,目标是防止重叠和相邻条目。采用了使用 EXCLUDE 子句和 GiST 索引的约束,但是对第二个分辨率的假设产生了担忧。

解决方案 1:假设第二个分辨率

如果应用程序仅需要第二个分辨率,假设这在约束中可能就足够了。然而,更高分辨率的数据类型可能需要更稳健的解决方案。

解决方案 2:包含边界

下限和上限的包含边界 ([]) 都允许使用范围函数通过 CHECK 约束进行重叠检测。带有 && 的 EXCLUDE 约束确保不重叠,而另一个 CHECK 约束强制执行包含边界。

解决方案 3:规范边界

规范边界 ([)] 促进非-通过 EXCLUDE 约束与 && 重叠。此外,在单独的 EXCLUDE 约束中使用相邻运算符 (-|-) 来禁止相邻条目。 CHECK 约束可确保适当的边界值。

实现详细信息:

-- Solution 2: Inclusive Bounds
CREATE TABLE tbl (
  tbl_id serial PRIMARY KEY,
  tsr tsrange,
  CONSTRAINT tsr_no_overlap  EXCLUDE USING gist (tsr WITH &&),
  CONSTRAINT tsr_enforce_incl_bounds CHECK (lower_inc(tsr) AND upper_inc(tsr))
);

-- Solution 3: Canonical Bounds
CREATE TABLE tbl (
  tbl_id serial PRIMARY KEY,
  tsr tsrange,
  CONSTRAINT tsr_no_overlap  EXCLUDE USING gist (tsr WITH &&),
  CONSTRAINT tsr_no_adjacent EXCLUDE USING gist (tsr WITH -|-),
  CONSTRAINT tsr_enforce_bounds CHECK (lower_inc(tsr) AND NOT upper_inc(tsr))
);
登录后复制

建议:

解决方案 3 提供了无论分辨率要求如何,都可以处理重叠和相邻条目的强大解决方案。

以上是PostgreSQL 的 EXCLUDE 约束如何防止重叠和相邻的日期/时间范围条目?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板