首页 > 代码库 > 约束(主键、非空、唯一性、外键、检查约束)

约束(主键、非空、唯一性、外键、检查约束)

一、五种约束

如果DML操作所涉及数据违反了已定义的约束,则数据库系统将拒绝执行这样的操作。

Oracle数据库中,约束具体包括非空(NOT NULL)约束、唯一键(UNIQUE)约束、主键(PRIMARY KEY)约束、外键(FOREIGN KEY)约束和检查(CHECK)约束五种。

和数据表类似,约束也属于数据库对象,可以在建表的同时创建其相关约束,也可以在建表后单独添加;可以由用户命名,也可以由系统按照默认格式自动对约束进行命名;按照约束的定义位置,又可以分为表级约束和字段级约束两种。

建表的同时创建约束的的语法格式为:

其中,column_constraint为字段级约束,字段级约束在字段定义时一并给出,也只能约束其所属的单个字段;table_constraints为表级约束,与表中的字段并列定义,可以约束单个或多个字段。

1、非空约束(只能在字段级定义)

例子:

查询数据字典视图user_constraints可得到其具体名称,SQL语句如下:

2、唯一性约束(列中最多有一个空值

Oracle会自动为唯一性约束的字段创建相应的唯一性索引。唯一性约束既可以在字段级定义、也可以在表级定义。

如果要在两个或两个以上字段上定义联合唯一键(字段组合不允许出现空值),就只能定义为表级约束了,例如:

3、主键约束(非空且唯一)

只允许一个主键,主键可以是单个字段或多字段的组合(联合主键),Oracle会自动为主键字段创建对应的唯一性索引。主键约束既可以在字段级定义、也可以在表级定义。

区别:主键是唯一的。

联合主键只能定义为表级约束:

4、外键约束

表级、字段级均可。

外键约束的特征:

(1)子表外键字段的值必须在主表被参照字段值得范围内,或者为NULL;

(2)外键参照的必须是主表的主键或唯一键(??);

(3)主表主键/唯一键被子表参照时,主表相应记录不允许被删除。

使用外键约束的相关原则:

(1)创建数据表时,先创建主表,后创建子表;删除表的顺序相反;

(2)添加数据时,先向主表中添加/插入记录,后向子表添加记录;删除数据操作顺序相反;

(3)修改数据(UPDATE)的情况要复杂一些,通常使用触发器实现。

外键约束可以和主键约束同时使用:

外键约束也可能构建于同一个表内部的两个字段之间:

5、检查约束

表级、字段级均可。

检查约束的条件表达式中不允许出现如下内容:
- currval, nextval, level, rownum等伪劣
- sysdate, uid, user, userenv等函数
- 对其它字段值的引用

其中, uid, user, userenv函数分别用于获取当前数据库用户ID,用户名及客户端计算机信息,如:

二、约束管理

1、查看约束

如要查看当前用户的所有约束,可查询用户字典视图user_constrains:

其返回结果中的"CONSTRAINT_TYPE"字段以缩写的方式标明约束条件的具体类型:"P"代表主键约束、 代表外键约束、"U"代表唯一键约束,检查和非空约束均使用"C"标明。

如果想知道约束建立在哪个字段上,则需要查询用户字典视图user_cons_columns:

2、添加约束(添加非空约束格式特别)

建表后添加非空约束的格式有些特别——必须使用MODIFY子句添加,实际上是修改了整个字段的定义(也可以同时修改字段类型、缺省值等),例如:

3、删除约束

其中,CASCADE用于指定删除当前约束的级联约束。

删除主键约束还有另外一种方式,其语法格式为:

删除约束时,如果还存在与该约束相关联的其他约束(如外键/关联)称为级联约束,则删除操作会失败,此时可使用CASCADE子句将其他关联约束一并删除。如:

删除表中字段时,如果该字段处于多字段联合约束条件(联合主键、联合唯一键、存在参照当前字段的外键)中,则删除会失败,此时可使用CASCADE CONSTRAINT子句将与该字段相关的约束一并删除。例如:

4、禁用约束

在ALTER TABLE语句中,还可以使用DISABLE CONSTRAINT子句禁用已有约束,即关闭数据校验功能,还可以使用CASCADE选项将相关联的约束一并禁用。其语法格式如下:

相应地,可以使用ENABLE CONSTRAINT子句启用先前被禁用的约束,例如:

和关闭约束操作的情形有所不同,此时无法再使用CASCADE选项一并启用相关联的其它约束。