有没有办法在两个整数字段上创建一个唯一索引,这样一个给定的整数只能在这些字段的一个中出现一次?即
+------+-------+
| Left | Right |
+------+-------+
| 1 | 2 |
| *2*| 3 | < INVALID
+------+-------+
编辑:请注意,left..right
范围仍应能够完整地包含其他范围:
+------+-------+
| Left | Right |
+------+-------+
| 1 | 4 |
| 2 | 3 | < VALID CHILD
+------+-------+
我正在使用 Rails 4 和 Postgres 9.2。
最佳答案
不是简单的 b-tree 唯一索引。您可以要求不同的对 - 并且使用函数索引,可以忽略对排序 - 但索引为每个元组获取一个叶子,并且确实没有办法解决这个问题。
正如 horse 所说,您需要将您的值转换为范围类型,然后使用排除约束来强制执行它。或者只使用触发器 - 速度较慢,但很容易。
编辑:看起来您原来的问题完全错误地陈述了目标。您根本对单个值不感兴趣,您将这些值对视为范围。你似乎想要:
- 排除部分重叠的范围;但是
- 允许范围完全重叠(一个包含另一个)或根本不重叠。
您可能可以通过使用 exclusion constraints 来实现这一目标。 - 但我有点怀疑,因为排除约束不允许任何重叠。同样,您可能正在寻找基于触发器的解决方案。
关于ruby-on-rails - 多个字段的唯一索引......但不是你想的那样,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19895064/