Sti*_*vdk 2 sql postgresql exclusion-constraint
我正在尝试对下表完成 PostgreSQL 约束:
CREATE TABLE contracts
(
id bigint NOT NULL,
startdate date NOT NULL,
enddate date NOT NULL,
price numeric(19,2) NOT NULL,
deleted boolean NOT NULL,
supplier_id bigint NOT NULL,
)
Run Code Online (Sandbox Code Playgroud)
它包含不同价格的供应商合同。在给定时间内,给定供应商只能存在一份合同。我制定了以下约束来强制执行:
ALTER TABLE contracts ADD CONSTRAINT overlaping_contracts EXCLUDE USING GIST (
supplier_id WITH =,
daterange(startdate, enddate) WITH &&
);
Run Code Online (Sandbox Code Playgroud)
这确保了不能插入与现有合同重叠的新合同。现在我们还支持合约的“软删除”。这会使旧合同无效并将“已删除”标志设置为 true。现在我想插入同一时期的新合同,但这重叠触发了约束。
我尝试将条件唯一索引与上述约束结合起来,但无法使其工作。有关排除约束的文档非常少。
我的直觉告诉我我必须添加类似的东西
deleted = false
Run Code Online (Sandbox Code Playgroud)
到排除约束,但我找不到正确的语法来执行此操作。
如何将排除约束与条件唯一索引结合起来,以便仅对已删除 = false 的行强制执行重叠约束?
这应该可以解决问题:
ALTER TABLE contracts ADD CONSTRAINT overlapping_contracts EXCLUDE USING GIST (
supplier_id WITH =,
daterange(startdate, enddate) WITH &&
) WHERE (NOT deleted);
Run Code Online (Sandbox Code Playgroud)
使用这个要点https://gist.github.com/fphilipe/0a2a3d50a9f3834683bf
| 归档时间: |
|
| 查看次数: |
1427 次 |
| 最近记录: |