Adicionando condição à restrição única

Dec 05 2020

Atualmente, tenho a seguinte restrição em uma mesa:

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

Quero adicionar uma condição à restrição: quero que a restrição funcione da mesma maneira, mas com apenas uma única linha em que is_archived é FALSE:

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

No entanto, quando faço isso, recebo um erro de sintaxe.

Se, is_archived = trueentão, várias linhas com a mesma combinação de content_ide brand_idsão permitidas. Basicamente, várias linhas iguais podem ser arquivadas, mas apenas uma pode ser desarquivada.

Respostas

4 Colin'tHart Dec 05 2020 at 00:59

Embora o Postgres não permita uma restrição parcialmente exclusiva, ele suporta um índice exclusivo parcial:

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

Consulte Índices parciais na documentação do Postgres.

Isso é praticamente o mesmo que uma restrição exclusiva, porque tais restrições são implementadas com índices exclusivos de qualquer maneira.