有効なレコードだけに一意性制約をかける
SQL標準にある強力なCHECK制約をPostgreSQLでも使いたいでござる。
http://sugar-tomato.hateblo.jp/entries/2013/07/02
有り体にいうと、一意性制約を付けて論理削除をしたい、というような表現になるのでしょうか。
無効化したレコードは無視して有効なレコードだけに一意性制約をつけたいとき、僕はこうしてます。
CREATE TABLE usres ( id bigserial NOT NULL PRIMARY KEY, name character varying(40) NOT NULL, enabled boolean DEFAULT true CHECK (enabled), CONSTRAINT users_name_enabled_key UNIQUE (name, enabled) );
enabledカラムには、有効なレコードだとtrueが、無効なレコードだとNULLが入ります。falseは制約により入りません。
enabledカラムがNULLのレコードはUNIQUEインデックスの対象外になるので、有効なレコードに対してだけ一意性制約がかかると。
(追記)
この手法はSQL Serverには使えませんが、SQL Serverではもっとシンプルに実現できます。こちらの記事を参照してください。