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

时间:2019-01-22 10:02:36

标签: 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,
)

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

ALTER TABLE contracts ADD CONSTRAINT overlaping_contracts EXCLUDE USING GIST (
        supplier_id WITH =,
        daterange(startdate, enddate) WITH &&
);

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

我试图将条件不确定性索引与上述约束组合在一起,但无法使其正常工作。关于排除约束的文档很小。

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

deleted = false

排除排斥,但我找不到合适的语法。

如何将排除约束与条件唯一索引结合在一起,以便仅在已删除= false的行上实施重叠约束?

1 个答案:

答案 0 :(得分:2)

这应该可以解决问题:

    ALTER TABLE contracts ADD CONSTRAINT overlapping_contracts EXCLUDE USING GIST (
    supplier_id WITH =,
    daterange(startdate, enddate) WITH &&
    ) WHERE (NOT deleted);

使用要点https://gist.github.com/fphilipe/0a2a3d50a9f3834683bf