1

有没有办法在两个整数字段上创建唯一索引,这样给定的整数只能在其中一个字段中出现一次?IE

+------+-------+
| Left | Right |
+------+-------+
|    1 |     2 |
|   *2*|     3 | < INVALID
+------+-------+

编辑:注意,left..right范围应该仍然能够包含其他范围的整体:

+------+-------+
| Left | Right |
+------+-------+
|    1 |     4 |
|    2 |     3 | < VALID CHILD
+------+-------+

我正在使用 Rails 4 和 Postgres 9.2。

4

1 回答 1

1

不是简单的 b-tree 唯一索引。您可以要求不同的- 并且使用功能索引,可以忽略对排序 - 但索引每个元组获得一个叶子,并且确实没有办法解决这个问题。

正如 horse 所说,您需要将值转换为范围类型,然后使用排除约束来强制执行它。或者只是使用触发器 - 速度较慢,但​​很容易。

编辑:看起来你原来的问题完全错误地陈述了目标。您根本对单个值不感兴趣,您将这些对视为范围。您似乎想要:

  • 排除部分重叠的范围;但
  • 允许完全重叠(一个包含另一个)或根本不重叠的范围。

您有可能通过使用排除约束的一些工作来实现这一点- 但我有点怀疑,因为排除约束不应该允许任何重叠。同样,您可能正在这里查看基于触发器的解决方案。

于 2013-11-11T00:33:48.890 回答