Hinzufügen einer Bedingung zur eindeutigen Einschränkung
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 = true
dann mehrere Zeilen mit der gleichen Kombination von content_id
und brand_id
zulässig sind. Grundsätzlich können mehrere gleiche Zeilen archiviert werden, aber nur eine kann nicht archiviert werden.
Antworten
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.