排除约束 `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 AB) ,请使用gist 索引来监控此约束”。

【讨论】:

感谢您是否可以添加最有意义的场景 找到了一个要点,其中显示了一个可能不在同一时间范围内预订的酒店房间的示例:gist.github.com/fphilipe/0a2a3d50a9f3834683bf @MaulikModi 请参阅最后的另一个酒店房间示例:blog.crunchydata.com/blog/postgres-constraints-for-newbies

以上是关于排除约束 `EXCLUDE USING gist (c WITH &&)` 是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章

rsync详解之exclude排除文件

rsync详解之exclude排除文件

rsync同步文件,排除多个文件/目录

为啥 pathspec 魔法 :(exclude) 不从 git log 的输出中排除指定的文件?

tar --exclude排除指定目录打包

如何使用 Get-ChildItem -exclude 排除多个文件夹?