【问题标题】:Postgresql Exclusion constraint with soft-deleted rows具有软删除行的 Postgresql 排除约束
【发布时间】:2019-06-15 18:29:51
【问题描述】:

我正在尝试对下表完成 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 &&
);

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

我尝试将条件 unqiue 索引与上述约束相结合,但无法使其工作。关于排除约束的文档非常少。

我的直觉告诉我我必须添加类似的东西

deleted = false

到排除约束,但我找不到正确的语法。

如何将排除约束与条件唯一索引结合起来,以便仅对已删除 = false 的行强制执行重叠约束?

【问题讨论】:

    标签: sql postgresql exclusion-constraint


    【解决方案1】:

    这应该可以解决问题:

        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

    【讨论】:

      猜你喜欢
      • 2012-10-26
      • 2013-12-16
      • 2020-01-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多