ORACLE – ограничение CHECK, обеспечивающее условную уникальность

У меня есть таблица PROGRAM, которая включает столбцы PROGRAM_NAME и PROGRAM_NUMBER.

PROGRAM_NUMBER уже уникален.

CREATE UNIQUE INDEX UNIQUE_PROG_NUMBER on PROGRAM(upper(PROGRAM_NUMBER));

Существует также ограничение, гарантирующее, что PROGRAM_NAME или PROGRAM_NUMBER всегда заполнены.

ALTER TABLE PROGRAM ADD CONSTRAINT NAME_OR_NUMBER_NOT_NULL
CHECK (PROGRAM_NAME IS NOT NULL OR PROGRAM_NUMBER IS NOT NULL) ENABLE;

Теперь появилось требование гарантировать, что если PROGRAM_NUMBER имеет значение null, то PROGRAM_NAME должно быть уникальным.

Возможно ли это применить в ограничении CHECK?


person p45    schedule 06.03.2015    source источник


Ответы (1)


Вы можете определить такого рода условное уникальное ограничение, используя индекс уникальности на основе функции.

CREATE UNIQUE INDEX idx_unique_program_name
    ON program( CASE WHEN program_number IS NULL
                     THEN program_name
                     ELSE NULL
                  END );

При этом используется тот факт, что Oracle не индексирует значения NULL, поэтому создаваемый индекс содержит только записи для строк, где program_number IS NULL. Это также позволяет избежать возможности того, что объединение строк приведет к получению слишком длинной строки или к тому, что первая строка будет иметь суффикс, который также является префиксом для другой строки.

person Justin Cave    schedule 06.03.2015