【问题标题】:PostgreSQL: Conditional unique constraintPostgreSQL:条件唯一约束
【发布时间】:2012-06-07 19:33:06
【问题描述】:

给定:

----------------------------------
      vin     | driver | is_owner
--------------+--------+----------
 231431cxzv87 | bob    | true
 231431cxzv87 | jeff   | false
 231431cxzv87 | greg   | false
 32342klj234s | jeff   | true

有没有办法添加一个约束,使每个 vin 只有一个所有者?


编辑:我找到了this question
添加partial unique index 是否适合此目的?

【问题讨论】:

  • 是的,您需要的是部分唯一索引。

标签: postgresql


【解决方案1】:

是的,部分索引是您的选择。

create unique index unique__vin on table (vin) where is_owner;

这里的索引仅涵盖 is_owner 为 true 的行,并且该行 vin 应该是唯一的。

【讨论】:

  • 知道为什么没有约束/检查约定,而不是使用索引吗?
  • @vol7ron:可能是因为约束(根据定义)总是应用于表中的所有行。
  • AFAIK 添加任何约束都需要在检查 vin 唯一性时查询表。查询表会导致索引扫描。您仍然会使用索引,但我认为每次检查都会花费您更多积分。
  • @a_horse_with_no_name: 但条件适用于表的所有行:) 只能有一个unique(a,b) where b is true,与每条记录进行比较。唯一约束已经将当前元组与其他元组进行了比较,以确保值不存在,以确保它确实是唯一的 - 完成的方式各不相同,但可能是通过哈希查找。部分索引做同样的事情,但有一个附加条件
猜你喜欢
  • 2013-04-20
  • 2010-10-26
  • 1970-01-01
  • 2021-07-22
  • 2017-07-07
  • 1970-01-01
  • 2018-12-02
  • 2012-07-21
相关资源
最近更新 更多