PostgreSQL:有条件的唯一性约束

8

给定:

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

有没有方法添加约束条件,以便每个vin只有一个所有者?


编辑: 我找到了这个问题
添加部分唯一索引是为了达到这个目的吗?


是的,部分唯一索引正是您所需要的。 - Frank Heikens
1个回答

15

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

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

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


有没有想过为什么没有约束/检查约定,而是使用索引? - vol7ron
1
@vol7ron:可能是因为约束(根据定义)总是应用于表中的所有行。 - user330315
据我所知,添加任何约束都需要在检查vin唯一性时查询表。查询表将导致索引扫描。您仍将使用索引,但我认为每次检查都会花费更多的点数。 - kworr
@a_horse_with_no_name: 但该条件将适用于表的所有行:) 只能有一个unique(a,b) where b is true,它与每条记录进行比较。唯一约束已将当前元组与其他元组进行比较,以确保这些值不存在,以确保它真正是唯一的 - 如何完成此操作因情况而异,但可能是通过哈希查找。部分索引正在执行相同的操作,但具有一个添加条件。 - vol7ron

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接