2017-03-29 3 views
0

Ich habe eine Torsion auf den üblichen „nicht überlappend“ Zeitperioden unter Verwendung von GistPostgres nicht überlappende Zeitperiode unter Verwendung von Gist mit Constraints

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); 

Ich habe die Tabelle oben die (Fremdschlüssel) company_ids und I Ich erstelle Sicherheitskennungen.

Jede Firma kann zu jeder Zeit viele Wertpapiere haben, aber nur eine Sicherheit kann die primäre Sicherheit sein. Ich vermute, es ist etwas wie die folgenden, aber nicht ein Beispiel finden folgen:

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

oder

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

beachten Sie, dass es nicht mit = werden primarylisting da, während ich nicht mehrere haben kann Primärwerte an einem beliebigen Punkt, kann ich mehrere nicht primäre Wertpapiere haben.

dank

+1

'AUSGESCHLOSSEN Kern weiter verwenden (company_id MIT =, validrange MIT &&) WHERE (primarylisting)' [sollte arbeiten] (https://www.postgresql.org/docs/current/static/sql-createtable.html#SQL-CREATETABLE-EXCLUDE). (Dies wird eine partielle Ausschlussbeschränkung sein.) - Sie sollten auch das ['btree_gist'-Modul] (https://www.postgresql.org/docs/current/static/btree-gist.html) verwenden. – pozs

+0

Gewinner! Danke - nicht sicher, wie man dies als Antwort markiert ... – user1487861

Antwort

0

Sie haben fast das right syntax erste Mal.

Aber WHERE Prädikat für partielle Einschränkungen (und Indizes) muss in Klammern sein. Außerdem sollten Sie keine BOOLEAN Spalte 1 vergleichen (man könnte bool_col = TRUE, bool_col IS TRUE oder nur bool_col verwenden):

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