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虚拟机的垃圾收集器不会对该对象进行回收)
参考文章: