详解Oracle中如何用非默认方式创建外键Oracle认证考试
文章作者 100test 发表时间 2009:04:09 23:22:01
来源 100Test.Com百考试题网
创建外键约束时如果使用Oracle默认的创建方式,在删除被参照的数据时,将无法被删除,这一点在Oracle9i中给了我们更多灵活的选择,我们可是使用on 0delete cascade和 on 0delete set null关键字来决定删除被参照数据时是否要将参照这个数据的那些数据一并删除,还是将那些参照这条数据的数据的对应值赋空。
例如下面这两个表中分别存的时员工的基本信息和公司的部门信息。我们为
create table dept
(deptno number(10) not null,
deptname varchar2(30) not null,
constraint pk_dept primary key(deptno)).
和
create table emp
( empno number(10) not null,
fname varchar2(20) ,
lname varchar2(20) ,
dept number(10) ,
constraint pk_emp primary key(empno)).
然后我们现在分别使用这两个关键字来增加外键试一下,首先我们来试一下on 0delete cascade
alter table emp
add constraint fk_emp_dept foreign key(dept) references dept(deptno) on 0delete cascade.
先增加外键。然后插入数据。
insert into dept values(1,’销售部’).
insert into dept values(2,’财务部’).
insert into emp values (2,’Mary’, Song’,1).
insert into emp values (3,’Linda’, Liu’,2).
insert into emp values (4,’Linlin’, Zhang’,1).
然后现在我要删除销售部,会有什么后果呢?
0delete from dept where deptno = 1.
我们发现除了dept中的一条数据被删除了,emp中两条数据也被删除了,其中emp中的两条数据是参照了销售部的这条数据的,这就很容易理解on 0delete cascade了。
接下来我们再来看on 0delete set null,顾名思义了,这种方式建立的外键约束,当被参照的数据被删除是,参照该数据的那些数据的对应值将会变为空值,下面我们还是通过试验来证明on 0delete set null作用:
首先恢复刚才的那几条数据,然后更改约束:
alter table emp
add constraint fk_emp_dept foreign key(dept) references dept(deptno) on 0delete set null.
然后我们在执行删除操作:
0delete from dept where deptno = 1.
你也会发现除了dept中的销售部被删除以外,emp中参照这条数据的两条数据的dept的值被自动赋空了,这就是on 0delete set null的作用了。
使用on 0delete set null有一点需要注意的是,被参参照其他表的那一列必须能够被赋空,不能有not null约束,对于上面的例子来说是emp中dept列一定不能有not null约束,如果已经定义了not null约束,又使用了on 0delete set null来删除被参照的数据时,将会发生:ORA-01407: 无法更新 (”DD”.”EMP”.”DEPT”) 为 NULL的错误。
总的来讲on 0delete cascade和on 0delete set null的作用是用来处理级联删除问题的,如果你需要删除的数据被其他数据所参照,那么你应该决定到底希望oracle怎么处理那些参照这些即将要删除数据的数据的,你可以有三种方式:
禁止删除。这也是Oracle默认的
将那些参照本值的数据的对应列赋空,这个需要使用on 0delete set null关键字
将那些参照本值的数据一并删除,这个需要使用on 0delete cascade关键字
更多优质资料尽在百考试题论坛 百考试题在线题库