代码之家  ›  专栏  ›  技术社区  ›  Boris Pavlović

如何在PostgreSQL数据库中声明范围重叠约束?

  •  0
  • Boris Pavlović  · 技术社区  · 15 年前

    假设我们有一个定义如下的表:

    range (
      id bigint primary key,
      colourId int references colour(id),
      smellId int references smell(id),
      from bigint,
      to bigint
    )
    

    这张桌子实际上是大桌子上的缩小视图:

    item (
      id bigint primary key,
      colourId int references colour(id),
      smellId int references smell(id),
      CONSTRAINT item_colour_smell_unique UNIQUE (colour, smell, id)
    )
    

    我想翻译 item_colour_smell_unique 中的约束 range 表。它应该观察范围的重叠 [from, to] 同时考虑到 colourId smellId 列值。

    3 回复  |  直到 6 年前
        1
  •  2
  •   intgr    15 年前

    请注意,任何基于触发器的解决方案在竞争条件下都是固有的不安全的,例如,当两个并发事务插入具有冲突范围的行时,由于“隔离”酸性属性(只能看到提交的数据),它们中的任何一个都不会看到另一个冲突行。

    一些解决方案:

    • 使用带有表显式锁定的过程来强制对插入进行序列化。
    • 将[从,到]范围拆分为[从,从+1,…,到-1,到]并为每个范围插入一行。这样就可以在“range”表上使用简单的唯一索引。

    PostgreSQL开发人员Jeff Davis has been writing about this lately 并将在PostgreSQL 8.5中实现范围冲突约束

        2
  •  1
  •   Richard Huxton    15 年前

    没有标准的“重叠”约束。你必须从一些触发器中构建自己的。尽管8.5节已经讨论过这个问题。

    您可能会发现“SEG”模块也很有用。参见手册-附录F。额外提供的模块

        3
  •  0
  •   Kuberchaun    15 年前

    这并不能完全给你一个答案,但听起来你可能想利用一个触发器。