понеділок, 19 червня 2017 р.

ENABLE NOVALIDATE проверяет имеющиеся данные

Понадобился мне констрейнт для проверки дублирующих записей в таблице, в которой уже присутствовали дубли. Добавил NOVALIDATE при создании и получил ошибку:
ORA-02299: cannot validate - duplicate keys found

Как выяснилось, при создании уникального ограничения создается уникальный индекс (не всегда, если оракл находит подходящий индекс - он будет использован). Выходом из ситуации стало добавление ключевого слова DEFERRABLE:
alter table TBL_1
  add constraint UK_TBL_1#NO_DOUBLE unique (col1, col2, col3, col4, col5)
  deferrable
  novalidate

DEFERRABLE делает так, что создается НЕуникальный индекс и констрейнт благополучно создается.

Также, можно было создать неуникальный индекс с самого начала и уже потом создать NOVALIDATE констрейнт.

Немає коментарів:

Дописати коментар