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;
: