我想为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)
?
预先感谢
我想为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)
?
预先感谢
定义列NOT NULL
是首选的方法。这将在DBA_TAB_COLS
,ALL_TAB_COLS
和USER_TAB_COLS
中指示数据字典视图,例如该列不是NULLABLE
。这也将是传统方法,因此未来的开发人员更可能期望NOT NULL
约束在不能为NULL
的列上定义。
正如你可以定义UNIQUE
约束与NOT NULL
限制一起,而不是创建PRIMARY KEY
限制,你可以定义CHECK
的限制,而不是NOT NULL
约束。从功能的角度来看,两种方法都将以相同的方式工作。但数据字典视图将以不同的方式显示这些方法,因此依赖于数据字典的工具可能会略有不同。而传统方法更有可能成为未来开发人员将会看到并期望的东西,而不是被惊讶。
还有就是甲骨文页面在这里的一些信息: http://docs.oracle.com/cd/B14117_01/appdev.101/b10795/adfns_co.htm#1006606
Oracle说: “为了方便使用,你应该总是选择定义的,而不是CHECK约束NOT NULL完整性约束,与IS NOT NULL条件。”
是的,有一个显着的区别 - 优化器对待它们的方式不同。通常,从这个角度来看,列级别的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);
只是有点相关的琐事︰NOT NULL是唯一的约束类型,你不需要知道约束名称以删除。 – 2012-03-11 14:41:10