Postgresql: условно уникальное ограничение - программирование
Подтвердить что ты не робот

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

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

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

Часть выше WHERE - это желаемое за действительное.

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

4b9b3361

Ответ 1

PostgreSQL не определяет частичное (т.е. условное) ограничение UNIQUE - однако вы можете создать частичный уникальный индекс. PostgreSQL использует уникальные индексы для реализации уникальных ограничений, поэтому эффект тот же, вы просто не увидите ограничение, указанное в information_schema.

CREATE UNIQUE INDEX stop_myc ON stop (col_a) WHERE (col_b is NOT null);

Смотрите частичные индексы.

Ответ 2

уже было сказано, что PG не определяет частичное (т.е. условное) уникальное ограничение. Также в документации сказано, что предпочтительным способом добавления уникального ограничения в таблицу является ADD CONSTRAINT уникальных индексов.

Предпочтительным способом добавления уникального ограничения в таблицу является ALTER TABLE... ADD CONSTRAINT. Использование индексов для обеспечения уникальных ограничений может рассматриваться как деталь реализации, к которой нельзя обращаться напрямую. Однако следует помнить, что нет необходимости вручную создавать индексы для уникальных столбцов; это просто дублирует автоматически созданный индекс.

Есть способ реализовать это с помощью исключающих ограничений (спасибо @dukelion за это решение)

В вашем случае это будет выглядеть так

ALTER TABLE stop
    ADD CONSTRAINT stop_col_a_key_part EXCLUDE (col_a WITH =) WHERE (col_b IS null);