Разница между ограничением NOT NULL и CHECK (атрибут не равен нулю)

Я хотел создать ограничение схемы для ключа изменения (NOT NULL + UNIQUE), но я думаю, что ограничение NOT NULL не может быть размещено в схеме, поэтому я думаю, что у меня есть варианты:

  • Ограничение контура: CHECK(attr IS NOT NULL)
  • Встроенное ограничение NOT NULL + контурное ограничение UNIQUE(attr)

Есть ли разница между установкой встроенного ограничения NOT NULL в столбец и добавлением ограничения CHECK (column IS NOT NULL)?

заранее спасибо


person Mario Corchero    schedule 11.03.2012    source источник
comment
Немного важных мелочей: NOT NULL — это единственный тип ограничения, для которого вам не нужно знать имя ограничения, чтобы его удалить.   -  person Jeffrey Kemp    schedule 11.03.2012


Ответы (3)


Предпочтительным подходом является определение столбца как NOT NULL. Это будет указывать в представлении словаря данных DBA_TAB_COLS, ALL_TAB_COLS и USER_TAB_COLS, например, что столбец не NULLABLE. Это также традиционный подход, поэтому будущие разработчики с большей вероятностью будут ожидать, что NOT NULL ограничения будут определены для столбцов, которые не могут быть NULL.

Точно так же, как вы могли бы определить ограничения UNIQUE вместе с ограничениями NOT NULL вместо создания ограничений PRIMARY KEY, вы могли бы определить ограничения CHECK, а не ограничения NOT NULL. Оба подхода будут работать одинаково с функциональной точки зрения. Но представления словаря данных будут отображать эти подходы по-разному, поэтому инструменты, которые полагаются на словарь данных, могут вести себя несколько иначе. И традиционные подходы, скорее всего, будут чем-то, что будущие разработчики увидят и ожидают, а не удивятся.

person Justin Cave    schedule 11.03.2012

На странице Oracle есть некоторая информация здесь: http://docs.oracle.com/cd/B14117_01/appdev.101/b10795/adfns_co.htm#1006606

Oracle говорит: «Для простоты использования вы всегда должны определять ограничения целостности NOT NULL вместо ограничений CHECK с условием IS NOT NULL».

person ksla    schedule 23.04.2013

Да, есть существенная разница - оптимизатор их трактует по-разному. Обычно с этой точки зрения предпочтительнее использовать NOT NULL на уровне столбца (может привести к лучшим планам выполнения).

Кстати, что касается комментария Джеффри Кемпа: «NOT NULL - это единственный тип ограничения, для которого вам не нужно знать имя ограничения, чтобы удалить его» - это утверждение неверно. Первичные ключи могут быть удалены, не зная их имен, например.

create table x(xx number primary key, yy number);
alter table x drop primary key;
alter table x modify xx unique;
alter table x drop unique(xx);
alter table x add unique(xx,yy);
alter table x drop unique(xx,yy);
person al0    schedule 15.01.2014