Menambahkan kondisi ke Batasan Unik

Dec 05 2020

Saat ini saya memiliki kendala berikut di atas meja:

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

Saya ingin menambahkan kondisi ke batasan: Saya ingin batasan bekerja dengan cara yang sama, tetapi hanya dengan satu baris di mana is_archived adalah FALSE:

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

Namun, ketika saya melakukan ini, saya mendapatkan kesalahan sintaks.

Jika is_archived = truekemudian beberapa baris dengan kombinasi yang sama content_iddan brand_iddiperbolehkan. Pada dasarnya beberapa baris yang sama dapat diarsipkan, tetapi hanya satu yang dapat dibatalkan pengarsipannya.

Jawaban

4 Colin'tHart Dec 05 2020 at 00:59

Meskipun Postgres tidak mengizinkan batasan unik sebagian, Postgres mendukung indeks unik parsial:

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

Lihat Indeks Parsial di dokumentasi Postgres.

Ini secara efektif hampir sama dengan batasan unik, karena batasan seperti itu diterapkan dengan indeks unik.