Postgresql: условно уникальное ограничение
Я хотел бы добавить ограничение, которое обеспечивает уникальность в столбце только в части таблицы.
ALTER TABLE stop ADD CONSTRAINT myc UNIQUE (col_a) WHERE (col_b is null);
Часть выше WHERE
- это желаемое за действительное.
Любой способ сделать это? Или мне нужно вернуться к реляционной чертежной доске?
Ответы
Ответ 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);