Postgresql: условно уникальное ограничение


Я хотел бы добавить ограничение, которое обеспечивает уникальность столбца только в части таблицы.

ALTER TABLE stop ADD CONSTRAINT myc UNIQUE (col_a) WHERE (col_b is null);

The WHERE часть выше-это принятие желаемого за действительное.

любой способ сделать это? Или я должен вернуться к реляционной чертежной доске?

2 65

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);