Orcale级联删除

外键提供表内或表间的完整性规则,外键必须依赖于一个 primary 或 uniquekey。
建立外键的格式:

建表时表约束:
CREATE TABLE EMP
(…
CONSTRAINT FK_DEPTNO FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO));
建表后:
ALTER TABLE EMP ADD CONSTRAINT FK_DEPTNO FOREIGN KEY (DEPTNO) REFERENCES DEPT(DEPTNO)

使用外键的最大好处是控制了子表中某些数据的取值范围,但是同样也带来了不少的问题:
1.外键起到约束的作用,插入非空值时,如果主键表中没有这个值,则不能插入;
2。更新时,不能改为主键表中没有的值;删除主键表记录时,你可以在建外键时
3.删除数据的时候,如果主表中的数据有对应的子表数据,则无法删除。选定外键记录一起级联删除还是拒绝删除;更新主键记录时,同样有级联更新和拒绝执行的选择。

级联删除:存在主外键的表使用delete时,应当先删除外键再删除主键,这是非常麻烦的,为此采用级联删除。但级联删除会造成未知错误,尤其是当你不明白关联规则时,同时关联规则删除是若发生问题,有可能回滚也可能不会滚。

级联删除解决方案:
1.在建立外建时添加on delete cascede,表示在进行delete事件时默认进行cascade,主表中的数据在删除时,可以自动删除掉其对应的子表对应相应行的数据会被删除。

alter table emp add constraint fk_emp_dept foreign key(dept) references dept(deptno) on delete cascade;

2.在建立外建时添加on delete nulle,表示在进行delete事件时子表对应外键字段填充null。

alter table emp add constraint fk_emp_dept foreign key(dept) references dept(deptno) on delete set null;

3.当未采取上述设置时,DROP TABLE ** CASCADE CONSTRAINTS 假设A为主表(既含有某一主键的表),B为从表(即引用了A的主键作为外键)。 则当删除A表时,如不特殊说明,则 drop table A 系统会出现错误警告的讯息而不会允许执行。 此时必须用,drop table A cascade constraints; SQL> select CONSTRAINT_NAME,TABLE_NAME from dba_constraints where owner = ‘SYS’ and TABLE_NAME = ‘B’ no rows selected 。我们可以发现利用Drop table cascade constraints可以刪除从表的constraint來达成你drop table的目的,原來属于B的foreign key constraint字段已经跟随着被删除掉了,但是,储存在table B中的资料不会被删除,也就是说Drop table cascade constraints 是不影响到存储于objec里的row data。

注:一般来说不会建立级联关系,因为级联会降低搜索的效率,如果关联几百张表那么每次都得去查询,会耗费大量的时间。当然一次查询出来后放入缓存区,后续的查询会很快,但第一次查询很痛苦,而且往往不需要那么多数据,因为一般来说表不会进行关联,一般是通过代码进行表的软关联。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值