Hinzufügen einer Bedingung zur eindeutigen Einschränkung

Dec 05 2020

Ich habe derzeit die folgende Einschränkung für eine Tabelle:

ALTER TABLE myTable
            ADD CONSTRAINT unique_row UNIQUE (content_id, brand_id, language_id);

Ich möchte der Einschränkung eine Bedingung hinzufügen: Ich möchte, dass die Einschränkung auf die gleiche Weise funktioniert, jedoch nur mit einer einzigen Zeile, in der is_archived FALSE ist:

ALTER TABLE myTable
         ADD CONSTRAINT unique_row UNIQUE (content_id, brand_id, language_id, !is_archived);

Wenn ich dies tue, erhalte ich jedoch einen Syntaxfehler.

Wenn is_archived = truedann mehrere Zeilen mit der gleichen Kombination von content_idund brand_idzulässig sind. Grundsätzlich können mehrere gleiche Zeilen archiviert werden, aber nur eine kann nicht archiviert werden.

Antworten

4 Colin'tHart Dec 05 2020 at 00:59

Während Postgres keine teilweise eindeutige Einschränkung zulässt, unterstützt es einen teilweise eindeutigen Index:

create unique index unique_row on myTable(content_id, brand_id) where not is_archived;

Siehe Teilindizes in der Postgres-Dokumentation.

Dies entspricht praktisch einer eindeutigen Einschränkung, da solche Einschränkungen ohnehin mit eindeutigen Indizes implementiert werden.