sql - 确保没有重叠的约束,但仅限于某些情况下,并且需要解决冲突?
问题描述
我在 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' 时评估约束,即使新行是“请求的”。
我还需要自动解决当我有多个重叠预订并将其中一个更改为“已接受”时出现的冲突。我有第三种状态,“已拒绝”,我希望更新现在导致冲突的所有行。
是否有可能使用排除约束来做到这一点?我是否需要寻找其他方法来处理问题?我想在数据库中实现它,因为如果我不这样做,我会遇到各种各样的并发问题和诸如此类的问题。
解决方案
推荐阅读
- python - 尝试在非包中进行相对导入”,即使使用 __init__.py
- azure-active-directory - Azure AD - 当用户确实有会话时,openid 连接 post_logout_redirect_uri
- reactjs - 在 ReactJS 中使用 Context 时如何将单个道具值传递给同一个组件
- xml - 按子节点内容对 XML 进行排序
- python-3.x - python中的ANOVA特征选择
- python - 如何在异常发生后立即停止执行函数?[Python]
- bash - 通过 STDIN 发送脚本和文件内容
- git - 无法删除具有特殊字符的 Git 标签
- python - 如何在python中的json数据中传递字符串变量
- css - 如何删除输入字段周围的轮廓?