具有软删除行的 Postgresql 排除约束
Postgresql Exclusion constraint with soft-deleted rows
我正在尝试在 table:
之后完成对 te 的 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,
)
它包含不同价格的供应商合同。对于给定时间,给定供应商只能存在一份合同。我已经制定了以下约束来强制执行:
ALTER TABLE contracts ADD CONSTRAINT overlaping_contracts EXCLUDE USING GIST (
supplier_id WITH =,
daterange(startdate, enddate) WITH &&
);
这样可以确保无法插入与现有合同重叠的新合同。现在我们还支持 "soft-deletion" 的合同。这会使旧合同无效并将 "deleted" 标志设置为 true。现在我想插入一个新的同期合同,但是这个重叠触发了约束。
我尝试将条件唯一索引与上述约束结合使用,但无法使其工作。关于排除约束的文档很少。
我的直觉告诉我必须添加类似
的内容
deleted = false
排除约束,但我找不到正确的语法。
如何将排除约束与条件唯一索引结合起来,以便仅对已删除 = false 的行强制执行重叠约束?
这应该可以解决问题:
ALTER TABLE contracts ADD CONSTRAINT overlapping_contracts EXCLUDE USING GIST (
supplier_id WITH =,
daterange(startdate, enddate) WITH &&
) WHERE (NOT deleted);
我正在尝试在 table:
之后完成对 te 的 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,
)
它包含不同价格的供应商合同。对于给定时间,给定供应商只能存在一份合同。我已经制定了以下约束来强制执行:
ALTER TABLE contracts ADD CONSTRAINT overlaping_contracts EXCLUDE USING GIST (
supplier_id WITH =,
daterange(startdate, enddate) WITH &&
);
这样可以确保无法插入与现有合同重叠的新合同。现在我们还支持 "soft-deletion" 的合同。这会使旧合同无效并将 "deleted" 标志设置为 true。现在我想插入一个新的同期合同,但是这个重叠触发了约束。
我尝试将条件唯一索引与上述约束结合使用,但无法使其工作。关于排除约束的文档很少。
我的直觉告诉我必须添加类似
的内容deleted = false
排除约束,但我找不到正确的语法。
如何将排除约束与条件唯一索引结合起来,以便仅对已删除 = false 的行强制执行重叠约束?
这应该可以解决问题:
ALTER TABLE contracts ADD CONSTRAINT overlapping_contracts EXCLUDE USING GIST (
supplier_id WITH =,
daterange(startdate, enddate) WITH &&
) WHERE (NOT deleted);