一、五种约束
如果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选项一并启用相关联的其它约束。