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

16 postgresql exclusion-constraint

来自PostgreSQL文档

排除约束确保如果使用指定的运算符在指定的列或表达式上比较任何两行,则这些运算符比较中的至少一个将返回false或null.语法是:

CREATE TABLE circles (
    c circle,
    EXCLUDE USING gist (c WITH &&)
);
Run Code Online (Sandbox Code Playgroud)

我想知道是什么EXCLUDE USING gist (c WITH &&)意思?特别是gist(),c WITH &&EXCLUDE USING.

它可以改写check吗?谢谢.

IMS*_*SoP 21

虽然CHECK约束根据表的单个行计算表达式,但EXCLUDE约束会计算表中两行的比较.可以把它想象成一个广义UNIQUE约束:而不是"没有两行可以相等",你可以说"没有两行重叠",甚至"没有两行可以不同 ".

为了在不检查每个可能的值组合的情况下实现此目的,它需要一个适当的索引结构,以便在插入或更新行时查找可能的违规.这就是gist声明中引用的部分:特定类型的索引,可用于加速除了相等之外的操作.

声明的其余部分是约束本身:c是要测试的列,并且&&是对于任何行对都不能返回true的运算符.在这种情况下,几何操作员手册页上列出的&&是"重叠"操作.

等摆放在一起,将约束EXCLUDE USING gist (c WITH &&)转化为"没有两个值c必须相互重叠(更准确地说,A.c && B.c必须返回所有不同的行假或零AB),并请用gist指数来监视这个约束".

  • 找到一个要点,显示酒店房间可能无法在同一时间范围内预订的示例:https://gist.github.com/fphilipe/0a2a3d50a9f3834683bf (6认同)