2

我想为更改键(NOT NULL + UNIQUE)创建一个大纲约束,但我认为 NOT NULL 约束不能放置大纲,因此,我认为我必须选择:

  • 轮廓约束:CHECK(attr IS NOT NULL)
  • 内嵌约束NOT NULL+ 轮廓约束UNIQUE(attr)

NOT NULL将内联约束设置为列和添加约束之间有什么区别CHECK (column IS NOT NULL)吗?

提前致谢

4

3 回答 3

6

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

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

于 2012-03-11T13:05:38.270 回答
2

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

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

于 2013-04-23T07:52:05.043 回答
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);
于 2014-01-15T09:32:31.250 回答