2017-10-07 3 views
2

Postgresには、次のように表示される3つの列を含むテーブルuser_badgeがあります。この表に複雑な一意性制約をPostgresに置きますか?

# 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 

、ユーザは、複数のバッジを有することができるが、各ユーザは、複数のアクティブバッジ(is_active列が真である、すなわち行)を有していなければなりません。

これを言っ別の方法は、クエリ

SELECT user_id FROM user_badge WHERE is_active; 

は一意の行を返さなければならないということです。

これはこの表に置いておきたい制約です。 Postgresを保証する方法はありますか? Postgresのdocumentation on constraintsでは、一意性制約を列と列のセットに配置する方法を見ていますが、一意制約にWHEREが含まれる例は見られません。これは部分インデックスの項でdocumentationに記載されている

create unique index unq_user_badge_user_is_active 
    on user_badge(user) where is_active; 

答えて

5

は、部分的または濾過インデックスを使用します。

関連する問題