排除约束 `EXCLUDE USING gist (c WITH &&)` 是啥意思?
Posted
技术标签:
【中文标题】排除约束 `EXCLUDE USING gist (c WITH &&)` 是啥意思?【英文标题】:What does exclusion constraint `EXCLUDE USING gist (c WITH &&)` mean?排除约束 `EXCLUDE USING gist (c WITH &&)` 是什么意思? 【发布时间】:2018-07-09 13:43:40 【问题描述】:来自 PostgreSQL 文档
排除约束确保如果任何两行在 使用指定的运算符指定的列或表达式,在 这些运算符比较中的至少一个将返回 false 或 null。这 语法是:
CREATE TABLE circles ( c circle, EXCLUDE USING gist (c WITH &&) );
我想知道EXCLUDE USING gist (c WITH &&)
是什么意思?特别是gist()
、c WITH &&
和EXCLUDE USING
。
可以改写成check
吗?谢谢。
【问题讨论】:
slideshare.net/pgconf/not-just-unique-exclusion-constraints @a_horse_with_no_name 我喜欢排除<>
以确保所有行匹配的示例。
【参考方案1】:
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
必须为所有不同的行返回 false 或 null A
和 B
) ,请使用gist
索引来监控此约束”。
【讨论】:
感谢您是否可以添加最有意义的场景 找到了一个要点,其中显示了一个可能不在同一时间范围内预订的酒店房间的示例:gist.github.com/fphilipe/0a2a3d50a9f3834683bf @MaulikModi 请参阅最后的另一个酒店房间示例:blog.crunchydata.com/blog/postgres-constraints-for-newbies以上是关于排除约束 `EXCLUDE USING gist (c WITH &&)` 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章