NOT NULL约束和CHECK之间的区别(attr不为null)

时间:2012-03-11 12:36:20

标签: database oracle isnull

我想为alter key创建一个轮廓约束(NOT NULL + UNIQUE),但我认为NOT NULL约束不能放置轮廓,因此,我认为我必须选择:

  • 大纲约束:CHECK(attr IS NOT NULL)
  • 内联约束NOT NULL +大纲约束UNIQUE(attr)

将内联约束NOT NULL设置为列并添加约束CHECK (column IS NOT NULL)之间是否存在差异?

提前致谢

3 个答案:

答案 0 :(得分:5)

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

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

答案 1 :(得分:2)

这里的Oracle页面上有一些信息: http://docs.oracle.com/cd/B14117_01/appdev.101/b10795/adfns_co.htm#1006606

甲骨文说: “为了便于使用,您应该始终选择定义NOT NULL完整性约束,而不是使用IS NOT NULL条件的CHECK约束。”

答案 2 :(得分:1)

是的,存在显着差异 - 优化器以不同方式对待它们。通常,从这个角度来看,列级别的NOT NULL是可取的(可能会产生更好的执行计划)。

BTW,至于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);