2012-03-11 55 views
2

我想为alter key(NOT NULL + UNIQUE)创建轮廓约束,但我认为NOT NULL约束不能放在outline中,因此,我想我必须选择:NOT NULL约束与CHECK之间的区别(attr不为空)

  • 纲要约束:CHECK(attr IS NOT NULL)
  • 在在线约束NOT NULL +轮廓约束UNIQUE(attr)

有没有设置在线约束有什么区别3210添加到列并添加约束CHECK (column IS NOT NULL)

预先感谢

+1

只是有点相关的琐事︰NOT NULL是唯一的约束类型,你不需要知道约束名称以删除。 – 2012-03-11 14:41:10

回答

5

定义列NOT NULL是首选的方法。这将在DBA_TAB_COLS,ALL_TAB_COLSUSER_TAB_COLS中指示数据字典视图,例如该列不是NULLABLE。这也将是传统方法,因此未来的开发人员更可能期望NOT NULL约束在不能为NULL的列上定义。

正如你可以定义UNIQUE约束与NOT NULL限制一起,而不是创建PRIMARY KEY限制,你可以定义CHECK的限制,而不是NOT NULL约束。从功能的角度来看,两种方法都将以相同的方式工作。但数据字典视图将以不同的方式显示这些方法,因此依赖于数据字典的工具可能会略有不同。而传统方法更有可能成为未来开发人员将会看到并期望的东西,而不是被惊讶。

1

是的,有一个显着的区别 - 优化器对待它们的方式不同。通常,从这个角度来看,列级别的NOT NULL是可取的(可能导致更好的执行计划)。

顺便说一句,对于Jeffrey Kemp评论“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);