oracle中级联删除

2011-07-19  戴华荣 

oracle中级联删除

级联删除:删除包含主键值的行的操作,该值由其它表的现有行中的外键列引用。在级联删除中,还删除其外键值引用删除的主键值的所有行。

创建表:

create table a

(

      id varchar(20) primary key,

      password varchar(20) not null

);

 b的外键userId,参考表a的主键id字段 

create table b

(

           name varchar(50) not null,

           userId varchar(20),

           foreign key (userId) references a(id)

 )   ;

 

准备数据:

  insert into a values ('11','aaa');

 insert into a values('23','aaa');

  insert into b values('da','11');

 insert into b values('das','11');

  insert into b values('ww','23');

 

b外键参考了表a的主键,我们可以把表a看做主表,表b看做子表。此时如果想要删除主表,必须先要删除子表。那么有没有其他办法可以在不删除子表的情况下,删除主表呢?有,使用级联删除,使用方法如下:

drop table a cascade constraint ;

此时,我们发现主表a已经被删除了,子表b并没有被删除,子表b中外键约束被删除了

 

这样的级联删除方法只会drop 表的时候有些,我们并不能对删除某条记录的时候使用该方法。例如,在执行“ delete from a where a.id = '11' 的时候可以把表b中引用到 id 11的数据删除。

那么用什么办法才可以做的到呢?答案是在建表的时候外键约束中加入级联删除。

首先,删除表

drop table a;

drop table b;

创建表:

 a保持不变 

create table a

(

      id varchar(20) primary key,

      password varchar(20) not null

);

 b外键信息中加入级联删除 

create table b

(

  name varchar(50) not null,

  userId varchar(20),

  foreign key (userId) references a(id) on delete cascade

 );


准备数据:

  insert into a values ('11','aaa');

 insert into a values('23','aaa');

  insert into b values('da','11');

 insert into b values('das','11');

  insert into b values('ww','23');

此时运行delete from a where a.id = '11' 发现,b中“da”“das”两条数据被级联删除了。

总结:

1.在实际的软件开发中尽量不要使用级联删除,如果主表中删除一条数据,将使多张子表中多条数据同时删除。

2.外键相当于一个指针,它指向主表。我们可以把外键看成一个引用,主表看成一个对象,当有引用(外键)指向某张表(对象)时,该表无法进行删除(类似与java中当有引用指向对象时,java虚拟机的垃圾收集器不会对该对象进行回收)

参考文章:

http://baike.baidu.com/view/690105.htm

http://www.verycd.com/topics/2737865/

531°/5304 人阅读/1 条评论 发表评论

小窝  2011-07-27

已同步至官方微博


登录 后发表评论