我想为更改键(NOT NULL + UNIQUE)创建一个大纲约束,但我认为 NOT NULL 约束不能放置大纲,因此,我认为我必须选择:
- 轮廓约束:
CHECK(attr IS NOT NULL)
- 内嵌约束
NOT NULL
+ 轮廓约束UNIQUE(attr)
NOT NULL
将内联约束设置为列和添加约束之间有什么区别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
约束。从功能的角度来看,这两种方法都将以相同的方式工作。但是数据字典视图会以不同的方式显示这些方法,因此依赖于数据字典的工具的行为可能会略有不同。传统方法更有可能成为未来开发人员将看到和期待的东西,而不是感到惊讶。
这里有一些关于 Oracle 页面的信息:http: //docs.oracle.com/cd/B14117_01/appdev.101/b10795/adfns_co.htm#1006606
Oracle 说:“为了便于使用,您应该始终选择定义 NOT NULL 完整性约束,而不是带有 IS NOT NULL 条件的 CHECK 约束。”
是的,有一个显着的区别 - 优化器以不同的方式对待它们。通常,从这个角度来看,列级别的 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);