読者です 読者をやめる 読者になる 読者になる

C Sharpens you up

http://qiita.com/yuba に移しつつあります

有効なレコードだけに一意性制約をかける

SQL

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ではもっとシンプルに実現できます。こちらの記事を参照してください。