Представьте, что у вас есть простая таблица:
name | is_active
----------------
A | 0
A | 0
B | 0
C | 1
... | ...
Мне нужно создать специальное уникальное ограничение, которое не выполняется в следующей ситуации: разные is_active
значения не могут сосуществовать для одного и того же name
значения.
Пример допустимого условия:
Примечание: простой многостолбцовый уникальный индекс не допускает такой комбинации.
A | 0
A | 0
B | 0
Пример допустимого условия:
A | 0
B | 1
Пример сбойного условия:
A | 0
A | 1
-- should be prevented, because `A 0` exists
-- same name, but different `is_active`
В идеале мне нужно уникальное ограничение или уникальный частичный индекс. Триггеры для меня более проблематичны.
Двойной A,0
разрешен, но (A,0) (A,1)
нет.
postgresql
exclusion-constraint
Андрей Скалюк
источник
источник
ERROR: data type boolean has no default operator class for access method "gist"
int
иsmallint
.EXCLUDE USING gist (name WITH =, (is_active::int) WITH <>)
если это логическое значение. И вопрос есть0
и1
, нет,true
иfalse
поэтому довольно маловероятно, что я тестировал сЭто не тот случай, когда вы можете использовать уникальный индекс. Вы можете проверить условие в триггере, например:
Проверьте это здесь.
источник