Adicionando condição à restrição única
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 = true
então, várias linhas com a mesma combinação de content_id
e brand_id
são permitidas. Basicamente, várias linhas iguais podem ser arquivadas, mas apenas uma pode ser desarquivada.
Respostas
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.