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
'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
Gewinner! Danke - nicht sicher, wie man dies als Antwort markiert ... – user1487861