Разница между ограничением NOT NULL и CHECK (attr не является нулевым) - PullRequest
2 голосов
/ 11 марта 2012

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

  • Ограничение Outline: CHECK(attr IS NOT NULL)
  • Ограничение In-Line NOT NULL + Ограничение Outline UNIQUE(attr)

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

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

Ответы [ 3 ]

5 голосов
/ 11 марта 2012

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

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

2 голосов
/ 23 апреля 2013

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

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

1 голос
/ 15 января 2014

Да, есть существенная разница - оптимизатор относится к ним по-разному. Как правило, 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...