2017-03-29 23 views
0

と要旨を使用したノンオーバーラップ期間、私は要旨Postgresの制約

CREATE TABLE foo(
id serial, 
company_id int NOT NULL, 
primarylisting boolean NOT NULL, 
validrange daterange NOT NULL, 
CONSTRAINT foo_primarykey PRIMARY KEY (id) 
) WITH (OIDS=FALSE); 

を用いた通常の「非重畳」の期間にひねりを持って、私は(外部キー)company_idsとIを有している上記の表を持っていますsecurityidsを作成しています。

各社はいつでも多くの証券を保有できますが、1つのセキュリティだけがプライマリセキュリティになります。私は次のようにその何かを疑うが、フォローする例を見つけることができません:それは= WITH primarylistingすることができないこと

ALTER TABLE foo ADD CONSTRAINT unique_primarylisting_daterange 
EXCLUDE USING gist (company_id WITH =,validrange WITH &&) where primarylisting=1; 

または

ALTER TABLE foo ADD CONSTRAINT unique_primarylisting_daterange 
EXCLUDE USING gist (company_id WITH =,validrange WITH &&, primarylisting WITH =1); 

ノート私は複数を持つことができない一方であるためいずれかの時点で第一次証券を取得すると、複数の非主要証券を保有することができます。

おかげ

+1

'(のcompany_id WITH =、validrange WITH &&)WHERE(primarylisting)' [要旨をすべき使用したEXCLUDE仕事](https://www.postgresql.org/docs/current/static/sql-createtable.html#SQL-CREATETABLE-EXCLUDE)。 (これは部分的な除外の制約になります) - [btree_gist'モジュール](https://www.postgresql.org/docs/current/static/btree-gist.html)も使いたいでしょう。 – pozs

+0

受賞者!ありがとうございます - 答えとしてマークする方法がわからない... – user1487861

答えて

0

あなたは、ほぼright syntax初めてです。

しかし、WHERE部分制約(およびインデックス)の述部は括弧内にする必要があります。また、あなたが1からBOOLEAN列を比較するべきではありません(あなたはbool_col = TRUEbool_col IS TRUEまたはちょうどbool_col使用することができます):

ALTER TABLE foo 
    ADD CONSTRAINT unique_primarylisting_daterange 
    EXCLUDE USING gist (company_id WITH =, validrange WITH &&) WHERE (primarylisting); 
関連する問題