PostgreSQL:条件唯一约束

PostgreSQL:条件唯一约束,postgresql,Postgresql,鉴于: 是否有方法添加约束,以便每个vin只有一个所有者 编辑:我找到了。 添加索引是为了满足此目的吗?是部分索引是您的选择 ---------------------------------- vin | driver | is_owner --------------+--------+---------- 231431cxzv87 | bob | true 231431cxzv87 | jeff | false 231431cxzv87 | greg

鉴于:

是否有方法添加约束,以便每个vin只有一个所有者


编辑:我找到了。

添加索引是为了满足此目的吗?

是部分索引是您的选择

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

这里的索引只包括“所有者”为true的行,使用该行vin应该是唯一的。

是的,您需要的是部分唯一的索引。知道为什么没有约束/检查约定,而不是使用索引吗?@vol7ron:可能是因为约束(根据定义)是唯一的始终应用于表中的所有行。AFAIK在检查vin唯一性时,添加任何约束都需要查询表。查询表将导致索引扫描。您仍将使用索引,但我认为每次检查都会花费您更多的分数。@a_horse_,带有_no_name:但该条件将应用于表的所有行:)只能有一个
唯一(a,b),其中b为true
,并与每条记录进行比较。唯一约束已经将当前元组与其他元组进行了比较,以确保值不存在,确保它确实是唯一的-执行此操作的方式有所不同,但可能是通过哈希查找。部分索引也在做同样的事情,但有一个附加条件
create unique index unique__vin on table (vin) where is_owner;