2012-06-13 21 views
7

私はデータベース内の1つのサブジェクトに複数のアドレスを格納する方法を見つけたいと思います。長い話を短くカットするPostgres Postgres 2つのカラムのユニークな制約:整数とブール

は、我々はテーブルを持って言うことができます:テーブル内の各idに

CREATE TABLE test 
(
    id integer NOT NULL, 
    active boolean NOT NULL, 
    CONSTRAINT pk_id PRIMARY KEY (id) 
) 

、高々1つの真のアクティブな値がなければなりません。

これをどのように達成できますか?

ありがとうございました。 @ThiefMasterとして

create unique index some_index on test (id) where active; 

は、プライマリインデックスが削除されなければならない状態:

+0

実際には、「id」がプライマリキーであるため、* ID *が2つの行になることができないため、何もする必要はありません。 – ThiefMaster

+0

'id'をプライマリにしたくない場合は、トリガを書く必要があります:http://www.postgresql.org/docs/9.1/static/sql-createtrigger.htmlそれはおそらくあなたが望むものではありません。 –

答えて

11

Partial indexは、あなたが望むものです。

+0

ありがとうございます。私のPKはこの表のアドレスPKなので、それは問題ありません。これも機能します:CREATE UNIQUE INDEX some_index オンテスト USING btree (アクティブ、id) WHEREアクティブ。 – greatkalu

+0

クエリで実際に変更されたのは、アクティブにインデックスを追加することだけです。アクティブなのは、インデックス作成の対象となるすべてのフィールドで常に真ですが、ほんの一部の膨らみが追加されました。 – kworr

+1

PKはUNIQUE制約とNOT NULL制約の和です。 – kworr

3

この質問の場合、前に説明したように必要ではありません。

しかしFYIのは、異なるタイプの2つ以上の(非プライマリキー)列に制約を設定します。たとえば:詳細情報については

ALTER TABLE table_name ADD CONSTRAINT constraint_name UNIQUE (integer_column, boolean_column); 

ConstraintsのためのPostgresのドキュメント、「ユニーク制約」を参照してください。引用すると:

を一意性制約が列のグループを参照する場合、列はカンマで区切られたリストされています...

これは、示された列の値の組み合わせがテーブル全体にわたって一意であることを指定しますいずれかの列が一意である必要はない(通常はそうではない)。

注: Aはpartial index全く異なる目的を持つテーブルのサブセット上に構築されたインデックスを設定します。

+0

私はあなたのソリューションで彼は複数の非アクティブなアドレスを持つことはできないと思う。 – Hossein

関連する問題