oracle中级联删除
级联删除:删除包含主键值的行的操作,该值由其它表的现有行中的外键列引用。在级联删除中,还删除其外键值引用删除的主键值的所有行。
创建表:
create table a
(
);
create table b
(
)
准备数据:
insert into a values('23','aaa');
insert into b values('das','11');
表b外键参考了表a的主键,我们可以把表a看做主表,表b看做子表。此时如果想要删除主表,必须先要删除子表。那么有没有其他办法可以在不删除子表的情况下,删除主表呢?有,使用级联删除,使用方法如下:
drop table a cascade constraint ;
此时,我们发现主表a已经被删除了,子表b并没有被删除,子表b中外键约束被删除了。
这样的级联删除方法只会drop 表的时候有些,我们并不能对删除某条记录的时候使用该方法。例如,在执行“
那么用什么办法才可以做的到呢?答案是在建表的时候外键约束中加入级联删除。
首先,删除表
drop table a;
drop table b;
创建表:
create table a
(
);
create table b
(
name varchar(50) not null,
userId varchar(20),
foreign key (userId) references a(id) on delete cascade
);
准备数据:
insert
insert
此时运行delete from a where a.id = '11' 发现,b中“da”“das”两条数据被级联删除了。
总结:
1.在实际的软件开发中尽量不要使用级联删除,如果主表中删除一条数据,将使多张子表中多条数据同时删除。
2.外键相当于一个指针,它指向主表。我们可以把外键看成一个引用,主表看成一个对象,当有引用(外键)指向某张表(对象)时,该表无法进行删除(类似与java中当有引用指向对象时,java虚拟机的垃圾收集器不会对该对象进行回收)
参考文章: