来自PostgreSQL文档
排除约束条件可确保是否在 使用指定的运算符在指定的列或表达式处 这些运算符比较中至少有一个将返回false或null。的 语法是:
CREATE TABLE circles ( c circle, EXCLUDE USING gist (c WITH &&) );
我想知道EXCLUDE USING gist (c WITH &&)
是什么意思?特别是gist()
,c WITH &&
和EXCLUDE USING
。
可以根据check
进行重写吗?谢谢。
答案 0 :(得分:14)
尽管CHECK
约束基于表的单行评估表达式,而EXCLUDE
约束则评估表中两行的比较。可以将其视为广义的UNIQUE
约束:您可以说“没有两行可以重叠”,甚至是“没有两行可以不同”。
为了在不检查所有可能的值组合的情况下实现此目的,它需要一个适当的索引结构,该结构允许它在插入或更新行时查找可能的违规情况。这就是声明的gist
部分所指的内容:a particular type of index可用于加速除相等以外的其他操作。
声明的其余部分是约束本身:c
是要测试的列,而&&
是运算符,对于任何一对行,都不得返回true。在这种情况下,&&
是“重叠”运算符as listed on the geometric operators manual page。
因此,将约束EXCLUDE USING gist (c WITH &&)
转换为“ c
的任何两个值都不得彼此重叠(更确切地说,A.c && B.c
对于所有不同的行{{ 1}}和A
),请使用B
索引来监视此约束”。