Dodawanie warunku do unikalnego ograniczenia

Dec 05 2020

Obecnie mam następujące ograniczenie na stole:

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

Chcę dodać warunek do ograniczenia: chcę, aby ograniczenie działało w ten sam sposób, ale tylko z jednym wierszem, w którym is_archived ma wartość FALSE:

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

Jednak kiedy to robię, pojawia się błąd składni.

Jeśli is_archived = truewtedy wiele wierszy z tą samą kombinacją content_idi brand_idjest dozwolonych. Zasadniczo można zarchiwizować wiele takich samych wierszy, ale tylko jeden można cofnąć.

Odpowiedzi

4 Colin'tHart Dec 05 2020 at 00:59

Chociaż Postgres nie zezwala na częściowo unikalne ograniczenie, obsługuje częściowy unikalny indeks:

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

Zobacz indeksy częściowe w dokumentacji Postgres.

Jest to praktycznie to samo, co unikalne ograniczenie, ponieważ takie ograniczenia i tak są implementowane z unikalnymi indeksami.