一意性制約への条件の追加

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ドキュメントの部分インデックスを参照してください。

このような制約はとにかく一意のインデックスで実装されるため、これは実質的に一意の制約とほとんど同じです。