Oracle约束(Constraint)详解(2)

  第一种方式简单粗暴,删除的时候,级联删除掉子表中的所有匹配行,在创建外键时,通过 on delete cascade 子句指定该外键列可级联删除:

SQL> alter table emp add constraint emp_deptno_fk foreign key(deptno) references dept (deptno) on delete cascade;

  第二种方式,删除父表中的对应行,会将对应子表中的所有匹配行的外键约束列置为NULL,通过 on delete set null 子句实施:

SQL> alter table emp add constraint emp_deptno_fk foreign key(deptno) references dept(deptno) on delete set null;

实际上,外键约束列和对应的父表列可以在同一张表中,常见的就是表的业务逻辑含义是一棵树,最简单的例子如下(id为主键id,fid为父id,fid存储对id的引用),这种结构的表根据业务要求可通过Oracle的递归查询来获取这种层级关系

Oracle约束(Constraint)详解

检查约束(CHECK)

检查约束可用来实施一些简单的规则,比如列值必须在某个范围内。检查的规则必须是一个结果为true或false 的表达式,比如:

SQL> alter table emp add constraint emp_sex_ck check(sex in('',''));

约束状态

  很多时候由于业务需要,比如我们有大量的历史数据,需要和现有数据合并,当前表存在数据库约束(如非空约束),而这些历史数据又包含违背非空约束的数据行,为了避免导入时由于违反约束而导入失败,我们通过调整约束状态来达到目的。

数据库约束有两类状态

  启用/禁用(enable/disable):是否对新变更的数据启用约束验证

  验证/非验证 (validate/novalidate) :是否对表中已客观存在的数据进行约束验证

这两类四种状态从语法角度讲可以随意组合,默认是 enable validate

下面我们来看着四类组合会分别出现什么样的效果:

enable validate : 默认的约束组合状态,无法添加违反约束的数据行,数据表中也不能存在违反约束的数据行;

enable novalidate : 无法添加违反约束的数据行,但对已存在的违反约束的数据行不做验证;

disable validate : 可以添加违反约束的数据行,但对已存在的违反约束的数据行会做约束验证(从描述中可以看出来,这本来就是一种相互矛盾的约束组合,只不过是语法上支持这种组合罢了,造成的结果就是会导致DML失败)

disable novalidate : 可以添加违法约束的数据行,对已存在的违反约束的数据行也不做验证。

拿上面的例子来说,我们需要上传大量违反非空约束的历史数据(从业务角度讲这些数据不会造成系统功能异常),可以临时将约束状态转为 disable novalidate,以保证这些不合要求的数据导入表中

SQL> alter table emp modify constraint emp_ename_nn disable novalidate;

在数据导入完成之后,我们再将约束状态转为enable novalidate 以确保之后添加的数据不会再违反约束

SQL> alter table emp modify constraint emp_ename_nn enable novalidate;

总结

  本文介绍了数据库中的五类约束,也提到了数据库约束的四种状态组合,当你由于业务需求或是系统扩展,在一个约束严苛的系统中由于约束限制频繁操作失败的时候,不同组合的约束状态或许能给你另一种处理方案。谢谢支持。

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/fac3336ac13638122a2aa08650d556ff.html