问题标签 [exclusion-constraint]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
3 回答
4929 浏览

sql - 在 PostgreSQL 中使用 EXCLUDE 防止相邻/重叠条目

我正在创建一个在 PostgreSQL 9.2.4 中存储任意日期/时间范围的数据库。我想在这个数据库上设置一个约束,强制日期/时间范围不重叠,也不相邻(因为两个相邻的范围可以表示为一个连续的范围)。

为此,我使用了EXCLUDE带有 GiST 索引的约束。这是我目前的约束:

fromto都是TIMESTAMP WITHOUT TIME ZONE, 并且是存储在 UTC 中的日期/时间(我在将数据插入应用程序中的这些列之前转换为 UTC,并且我在 postgresql.conf 中将数据库的时区设置为“UTC”)。

不过,我想我可能遇到的问题是,这个约束正在做出(不正确的)假设,即没有小于一秒的时间增量。

值得注意的是,对于我存储的特定数据,我只需要第二个分辨率。但是,我觉得我可能仍然需要处理这个问题,因为 SQL 类型timestamptimestamptz分辨率都高于一秒。

我的问题是:简单地假设第二个解决方案有什么问题,因为这就是我的应用程序需要(或想要的),或者,如果有,我如何改变这个约束来处理几分之一秒健壮的方式?

0 投票
1 回答
18664 浏览

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

来自 PostgreSQL 文档

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

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

可以重写check吗?谢谢。

0 投票
1 回答
44 浏览

postgresql - 无法将排除约束添加到表

我无法使用此架构创建排除索引。

此处最后的 alter table 行失败了

我已经仔细检查了文档,但我真的看不出我在这里做错了什么。

x86_64-pc-linux-gnu 上的 PostgreSQL 9.6.9,由 gcc (Ubuntu 7.2.0-8ubuntu3.2) 7.2.0 编译,64 位

0 投票
1 回答
735 浏览

sql - 具有软删除行的 Postgresql 排除约束

我正在尝试对下表完成 PostgreSQL 约束:

它包含不同价格的供应商的合同。在给定时间内,给定供应商只能存在一份合同。我做了以下约束来强制执行:

这确保了不能插入与现有合同重叠的新合同。现在我们还支持“软删除”合同。这会使旧合同无效并将“已删除”标志设置为真。现在我想在同一时期插入一份新合同,但这重叠触发了约束。

我尝试将条件 unqiue 索引与上述约束相结合,但无法使其工作。关于排除约束的文档非常少。

我的直觉告诉我我必须添加类似

排除约束,但我找不到正确的语法。

如何将排除约束与条件唯一索引结合起来,以便仅对已删除 = false 的行强制执行重叠约束?

0 投票
1 回答
74 浏览

postgresql - 跨多个表排除约束?

考虑下表:

为了防止同一楼层有两部电梯,我可以选择:

在这种情况下,3 将与 4 冲突。

但是我确实有一个连接表:

所以(3)完成room_id = 1和(4)完成room_id = 2,它们不会冲突。

1 和 2 在连接表中没有条目,因此所有房间都被占用。

我知道这exclude仅适用于当前表格的范围 - 我该如何处理?我应该制作多余的列吗?

添加room_idtodos不是一个选项,因为这只是一个最小的示例,在现实生活中的应用程序中,我有更多的 0..N 连接。

0 投票
1 回答
310 浏览

postgresql - 防止 PostgreSQL 中 CIDR 列上的值重叠

是否有约束或其他一些 PostgreSQL 功能阻止 CIDR 列具有重叠的值?

例如:

192.168.1.0/24192.168.1.1/32

这些不能一起存在,因为192.168.1.1/32包含在192.168.1.0/24子网中。

0 投票
1 回答
148 浏览

postgresql - 允许在边界重叠的排除约束

我试图有一个 PostgreSQL 约束,以便两个日期间隔之间不会有重叠。我的要求是c_from一个条目的日期可以与c_until另一个日期相同。

例如:“01/12/2019 12/12/2019”和“12/12/2019 31/21/2019”仍然是不冲突的日期范围。我的查询中有“[]”,但它似乎不起作用。

当我有上述日期范围时,我收到此错误:

能否请你帮忙?

0 投票
1 回答
2268 浏览

sql - Postgresql EXCLUDE 约束在 INSERT 时未触发 ON CONFLICT

我已经定义了这个表:

但是当我执行这个 SQL 时:

我期待该ON CONFLICT子句被执行,因为要插入一些具有相同的行item_idsale_price并且valid_time与现有行相邻。相反,我得到了这个:

我误解了什么吗?我相信第二EXCLUDE个子句中的排除约束涉及相同的 3 列。我正在搜索文档,但ON CONFLICT说明对我来说不是那么清楚。

0 投票
1 回答
990 浏览

postgresql - 如何使用具有排除约束的 ON CONFLICT?

例如:索引userid, sdate,edate

如果我插入新数据,例如:

我在下面尝试使用 GIST,但是如何使用它来组合它ON CONFLICT

我有:

基于上述情况,我预计以下情况:

选择版本()显示:

0 投票
3 回答
269 浏览

sql - Recursive SQL Query with Postgres Ranges To Find Availability

I followed this blogpost: https://info.crunchydata.com/blog/range-types-recursion-how-to-search-availability-with-postgresql

and found this function to be buggy when I've inserted rows with duration back to back

This works as expected at this point.

But when this row is added:

And re-run

I get