首页 > 解决方案 > 确保没有重叠的约束,但仅限于某些情况下,并且需要解决冲突?

问题描述

我在 PostgreSQL 数据库中有一个表,我在其中存储跨时间段的预订。此类预订之间必须至少间隔 45 分钟。我目前在表上有这个约束:

EXCLUDE USING GIST (
    tsrange(start_time AT TIME ZONE 'UTC', end_time END AT TIME ZONE 'UTC' + interval '45 minutes', '[)') WITH &&
)

这可以防止添加开始时间在某些现有行的结束时间之后不到 45 分钟或结束时间在现有开始时间之前不到 45 分钟的新行。现在,预订可以处于不同的状态,例如“已请求”和“已接受”。45 分钟规则仅适用于已接受的预订(只要它们都被“请求”,预订应该可以重叠)。我试图通过添加WHERE status='accepted'约束来解决这个问题,但这不会捕获添加与已接受的预订重叠的新预订(默认为“已请求”)。我需要一个 WHERE 子句,该子句将导致每次现有行具有 status='accepted' 时评估约束,即使新行是“请求的”。

我还需要自动解决当我有多个重叠预订并将其中一个更改为“已接受”时出现的冲突。我有第三种状态,“已拒绝”,我希望更新现在导致冲突的所有行。

是否有可能使用排除约束来做到这一点?我是否需要寻找其他方法来处理问题?我想在数据库中实现它,因为如果我不这样做,我会遇到各种各样的并发问题和诸如此类的问题。

标签: sqlpostgresqlconstraintsexclusion-constraint

解决方案


推荐阅读