Agregar condición a la restricción única

Dec 05 2020

Actualmente tengo la siguiente restricción en una mesa:

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

Quiero agregar una condición a la restricción: quiero que la restricción funcione de la misma manera, pero con una sola fila donde is_archived es FALSE:

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

Sin embargo, cuando hago esto, obtengo un error de sintaxis.

Si is_archived = trueentonces se permiten varias filas con la misma combinación de content_idy brand_id. Básicamente, se pueden archivar varias filas que son iguales, pero solo una se puede desarchivar.

Respuestas

4 Colin'tHart Dec 05 2020 at 00:59

Si bien Postgres no permite una restricción parcialmente única, sí admite un índice único parcial:

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

Consulte Índices parciales en la documentación de Postgres.

Esto es prácticamente lo mismo que una restricción única, porque de todos modos dichas restricciones se implementan con índices únicos.