排除约束 `EXCLUDE USING gist (c WITH &&)` 是什么意思?

74

来自 PostgreSQL 文档

排除约束确保如果使用指定操作符对指定列或表达式上的任意两行进行比较,那么这些操作符中至少有一个将返回 false 或 null。 语法如下:

CREATE TABLE circles (
    c circle,
    EXCLUDE USING gist (c WITH &&)
);
我在想 EXCLUDE USING gist (c WITH &&) 是什么意思?特别是,gist()c WITH &&EXCLUDE USING。它能否用 check 重新表达?谢谢。

4
https://www.slideshare.net/pgconf/not-just-unique-exclusion-constraints - user330315
@a_horse_with_no_name 我喜欢使用 <> 来排除确保所有行匹配的示例。 - IMSoP
1个回答

121

CHECK 约束基于表中的单个行评估表达式,而 EXCLUDE 约束则评估表中两行之间的比较。可以将其视为广义的 UNIQUE 约束:不是 "没有两行可以相等",而是可以说像 "没有两行重叠",甚至是 "没有两行可以是不同的"。

为了在不检查所有可能值组合的情况下实现此目标,它需要适当的索引结构,使其能够在插入或更新行时找到可能的违规情况。这就是声明中 gist 部分所指的:一种特定类型的索引,可用于加快除相等性外的其他操作。

声明的余下部分是约束本身:c 是要测试的列,&& 是不得对任何一对行返回 true 的运算符。在本例中,&& 是" 重叠" 运算符(如几何运算符手册页面上所列出的)

因此,综合考虑,约束条件EXCLUDE USING gist (c WITH &&)的翻译是“c的任何两个值都不能重叠(更准确地说,对于所有不同的行ABA.c && B.c必须返回false或null),请使用gist索引来监控此约束条件”。


1
感谢您能够添加最合适使用的场景。请注意,以下是翻译后的文本:感谢您能够添加最合适使用的场景。 - Maulik Modi
6
发现了一个代码片段,展示了一个酒店中可能不在同一时间预订的房间的例子:https://gist.github.com/fphilipe/0a2a3d50a9f3834683bf - Fabian
1
@MaulikModi 请看这里的另一个酒店房间示例:https://blog.crunchydata.com/blog/postgres-constraints-for-newbies - Blama
1
@IMSoP,你如何创建一个约束条件来确保“没有两行可以不同”?也就是说,我只想在用户不同时排除tsrange重叠... - Zaffer
@Zaffer 这听起来像是一个新问题,而不是与这个答案直接相关的内容,因此应该在自己的页面上发布。不过,在 a_horse_with_no_name 链接的幻灯片中有一个例子,可能是你正在寻找的。 - IMSoP
@IMSoP,我提出了一个更详细的问题,也许有一种更好的方法来解决它,而不是使用“不等于”的东西... https://stackoverflow.com/q/72207993/14305096 - Zaffer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接