一意性制約への条件の追加
Dec 05 2020
現在、テーブルには次の制約があります。
ALTER TABLE myTable
ADD CONSTRAINT unique_row UNIQUE (content_id, brand_id, language_id);
制約に条件を追加したい:制約を同じように機能させたいが、is_archivedがFALSEである行が1つしかない:
ALTER TABLE myTable
ADD CONSTRAINT unique_row UNIQUE (content_id, brand_id, language_id, !is_archived);
ただし、これを行うと、構文エラーが発生します。
場合is_archived = true
の同じ組み合わせで、複数の行content_id
とがbrand_id
許可されています。基本的に、同じである複数の行をアーカイブできますが、アーカイブを解除できるのは1つだけです。
回答
4 Colin'tHart Dec 05 2020 at 00:59
Postgresは部分的に一意の制約を許可していませんが、部分的に一意のインデックスをサポートしています。
create unique index unique_row on myTable(content_id, brand_id) where not is_archived;
Postgresドキュメントの部分インデックスを参照してください。
このような制約はとにかく一意のインデックスで実装されるため、これは実質的に一意の制約とほとんど同じです。