Добавление условия в уникальное ограничение
В настоящее время у меня есть следующее ограничение на таблицу:
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
. Обычно можно заархивировать несколько одинаковых строк, но разархивировать можно только одну.
Ответы
Хотя Postgres не допускает частичного уникального ограничения, он поддерживает частичный уникальный индекс:
create unique index unique_row on myTable(content_id, brand_id) where not is_archived;
См. Частичные индексы в документации Postgres.
По сути, это почти то же самое, что и ограничение уникальности, потому что такие ограничения в любом случае реализуются с помощью уникальных индексов.