Добавление условия в уникальное ограничение

Dec 05 2020

В настоящее время у меня есть следующее ограничение на таблицу:

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

Я хочу добавить условие к ограничению: я хочу, чтобы ограничение работало таким же образом, но только с одной строкой, где is_archived имеет значение FALSE:

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

Однако при этом я получаю синтаксическую ошибку.

Если is_archived = trueтогда допускается несколько строк с одинаковой комбинацией content_idи brand_id. Обычно можно заархивировать несколько одинаковых строк, но разархивировать можно только одну.

Ответы

4 Colin'tHart Dec 05 2020 at 00:59

Хотя Postgres не допускает частичного уникального ограничения, он поддерживает частичный уникальный индекс:

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

См. Частичные индексы в документации Postgres.

По сути, это почти то же самое, что и ограничение уникальности, потому что такие ограничения в любом случае реализуются с помощью уникальных индексов.