oracle中级联删除

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/

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值