在Postgres中放置复杂唯一性约束?

mhe*_*rzl 2 postgresql constraints

Postgres,我有一个user_badge包含三列的表,显示如下.

# select * from user_badge;
 id | user_id | badge_id | is_active |
----+---------+----------+------------
 1    bob       00001      False
 2    bob       00002      True
 3    alice     00003      True
 4    alice     00004      False
 5    alice     00005      False
Run Code Online (Sandbox Code Playgroud)

在此表中,用户可以拥有多个徽章,但每个用户不得拥有多个活动徽章(即列为is_activeTrue的行).

另一种说法,就是查询

SELECT user_id FROM user_badge WHERE is_active;
Run Code Online (Sandbox Code Playgroud)

必须返回唯一的行.

这是我希望放在这张桌子上的一个限制因素.有没有办法指定Postgres保证它?在Postgres 关于约束文档中,我看到如何可以在列和一组列上放置唯一性约束,但是没有看到唯一性约束涉及的示例WHERE.

Gor*_*off 5

使用部分或过滤的索引:

create unique index unq_user_badge_user_is_active
    on user_badge(user) where is_active;
Run Code Online (Sandbox Code Playgroud)

有关部分索引的部分中的文档中对此进行了描述.