ruby-on-rails - 多个字段的唯一索引......但不是你想的那样

标签 ruby-on-rails postgresql multiple-columns unique-constraint

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

+------+-------+
| 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/

相关文章:

ruby-on-rails - 使用 Postgres 在 Rails 中设置外键

ruby-on-rails - 验证 rails 3.2 中的 has_many 关系

javascript - BackboneJS、RequireJS 应用程序模块可从整个项目访问

sql - 如果表中存在数字则返回 1,否则返回 0

postgresql - Openbravo - 在 Ubuntu 中连接 pgadmin 和 postgresql 数据库

ruby-on-rails - 从 Rails 原始 SQL 查询中获取数据

java - 根据用户输入在PreparedStatement中使用setTime()或setNull()

html - 放置 margin 时 Bootstrap 列不起作用

jquery - 具有等高边框的等高列的跨浏览器 CSS

mysql - 设置变量结果,来自查询