2012-07-04 5 views
4

У меня есть следующие ограничения уникальности,Oracle Уникальный Constraint на основе значения столбца

dup_Checklist_QNum UNIQUE (QUESTION_NO, IS_ACTIVE) 

Я пытаюсь предотвратить два вопроса, имеющих один и тот же номер вопроса, будучи активным (IS_ACTIVE значение = 1).

Все казалось прекрасным до тех пор, пока мне не пришлось повторно задать вопрос во второй раз.

QUESTION_NO=1, TEXT="Have you..", REV=1 IS_ACTIVE=0 
QUESTION_NO=1, TEXT="Have you..", REV=2 IS_ACTIVE=0 <-- This should be ok but constraint was violated 
QUESTION_NO=1, TEXT="Have you..", REV=3 IS_ACTIVE=1 
QUESTION_NO=1, TEXT="Have you..", REV=3 IS_ACTIVE=1 <-- This should be throw constraint exception 

мне нужно constrint применять только тогда, когда IS_ACTIVE = 1

+0

Я думаю, что работаю, я могу просто деактивировать вопросы, используя уникальный номер 0.1, 0.2, 0.3 и т. Д. При условии, что мое приложение заботится только о том, когда значение равно 1, и игнорирует все остальные вопросы. – jeff

+1

Возможный дубликат [Условное единственное ограничение в oracle db] (http://stackoverflow.com/questions/10317774/conditional-unique-constraint-in-oracle-db) –

ответ

13

Вы можете создать уникальный индекс-функции

CREATE UNIQUE INDEX idx_dup_active 
    ON <<table name>>(CASE WHEN is_active = 1 
          THEN question_no 
          ELSE NULL 
         END); 

Это имеет преимущество в том, что Oracle индексы B-Tree не сохраняйте данные, где данные листового блока будут полностью NULL.

+1

Интересно, когда Oracle, наконец, дает нам менее неуклюжие частичные индексы разрешая предложение WHERE для CREATE INDEX. –

Смежные вопросы