52

来自 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

1 回答 1

84

CHECK约束基于表的单行计算表达式,而约束计算表EXCLUDE中两行的比较。把它想象成一个广义的UNIQUE约束:不是“没有两行可以相等”,你可以说“没有两行重叠”,甚至“没有两行可以不同”。

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

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

所以放在一起,约束EXCLUDE USING gist (c WITH &&)转换为“没有两个值c必须相互重叠(更准确地说,A.c && B.c必须为所有不同的行返回 false 或 null ),A并且B请使用gist索引来监视这个约束”。

于 2018-07-09T14:15:10.490 回答