Postgresql: условно уникальное ограничение
Я хотел бы добавить ограничение, которое обеспечивает уникальность столбца только в части таблицы.
ALTER TABLE stop ADD CONSTRAINT myc UNIQUE (col_a) WHERE (col_b is null);
The WHERE
часть выше-это принятие желаемого за действительное.
любой способ сделать это? Или я должен вернуться к реляционной чертежной доске?
2 ответа:
PostgreSQL не определяет частичное (т. е. условное)
UNIQUE
ограничения - однако вы можете создать частичный уникальный индекс. PostgreSQL использует уникальные индексы для реализации уникальных ограничений, поэтому эффект тот же, вы просто не увидите константу, указанную вinformation_schema
.CREATE UNIQUE INDEX stop_myc ON stop (col_a) WHERE (col_b is null);
посмотреть частичные индексы.
уже было сказано, что PG не определяет частичное (т. е. условное) уникальное ограничение. Также в документации говорится, что предпочтительным способом добавления уникального ограничения в таблицу является
ADD CONSTRAINT
Уникальные Индексыпредпочтительный способ, чтобы добавить ограничение уникальности для таблицы Alter таблицы ... ДОБАВИТЬ ОГРАНИЧЕНИЕ. Использование индексов для применения уникальных ограничений можно рассматривать как деталь реализации, к которой не следует обращаться напрямую. Надо, однако имейте в виду, что нет необходимости вручную создавать индексы для уникальных столбцов; это просто дублирует автоматически созданный индекс.
есть способ реализовать это с помощью Ограничения Исключения, (спасибо @dukelion за это решение)
в вашем случае это будет выглядеть как
ALTER TABLE stop ADD CONSTRAINT stop_col_a_key_part EXCLUDE (col_a WITH =) WHERE (col_b IS null);