Dodawanie warunku do unikalnego ograniczenia
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 = true
wtedy wiele wierszy z tą samą kombinacją content_id
i brand_id
jest dozwolonych. Zasadniczo można zarchiwizować wiele takich samych wierszy, ale tylko jeden można cofnąć.
Odpowiedzi
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.