【Oracle学习】之 外键约束(3种删除-详细)与 约束激活(失效)

前端之家收集整理的这篇文章主要介绍了【Oracle学习】之 外键约束(3种删除-详细)与 约束激活(失效)前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

Q:删除主表记录(子表外键存在下),3种删除方式?
A:①默认删除(default) ②级联删除 ③置空删除。具体操作见下文


主表和子表的概念:
如果表中定义了外键约束,那么该表通常被称为子表,例如下文的test_student表
如果表中包含引用键,那么该表被称为父表,例如test_class表

一、外键删除

①默认删除—-即什么都不加 或 使用 no action关键字

简介:如果在定义外键约束时使用no action关键字,那么当父表中被引用列的数据被删除时,将违反外键约束,改操作也将被禁止执行,这也是外键约束的默认引用类型。

//查看test_student 有哪些约束
select@H_502_41@ constraint_type,table_name from@H_502_41@ user_constraints where@H_502_41@ table_name = 'TEST_STUDENT'@H_502_41@;@H_502_41@

//添加约束
alter@H_502_41@ table@H_502_41@ test_student add@H_502_41@ constraint@H_502_41@ FK_TAB_STUDNET_TAB_CLASS foreign@H_502_41@ key@H_502_41@ (s_fk_id) references@H_502_41@ test_class (c_id);@H_502_41@

select@H_502_41@ * from@H_502_41@ test_class;@H_502_41@
select@H_502_41@ * from@H_502_41@ test_student;@H_502_41@ 
delete@H_502_41@ from@H_502_41@ test_class where@H_502_41@ c_id = 1@H_502_41@;@H_502_41@


②级联删除—-使用关键字 cascade

简介:如果在定义外键约束时使用cascade关键字,那么当父表中被引用列的数据被删除时,子表中对应的数据也将被删除

//删除
alter@H_502_41@ table@H_502_41@ test_student drop@H_502_41@ constraint@H_502_41@ FK_TAB_STUDNET_TAB_CLASS;@H_502_41@
//添加
alter@H_502_41@ table@H_502_41@ test_student add@H_502_41@ constraint@H_502_41@ FK_TAB_STUDNET_TAB_CLASS foreign@H_502_41@ key@H_502_41@ (s_fk_id) references@H_502_41@ test_class (c_id) on@H_502_41@ delete@H_502_41@ cascade@H_502_41@;@H_502_41@

select@H_502_41@ * from@H_502_41@ test_class;@H_502_41@
select@H_502_41@ * from@H_502_41@ test_student;@H_502_41@ 
delete@H_502_41@ from@H_502_41@ test_class where@H_502_41@ c_id = 1@H_502_41@;@H_502_41@

③置空删除—-使用关键字set null

简介:如果在定义外键约束时使用set null关键字,那么当主表中被引用列的数据被删除时,子表中对应的数据被设置为null。要使这个关键字起作用,子表中的对应列必须支持NULL值。

//删除
alter@H_502_41@ table@H_502_41@ test_student drop@H_502_41@ constraint@H_502_41@ FK_TAB_STUDNET_TAB_CLASS;@H_502_41@
//添加
alter@H_502_41@ table@H_502_41@ test_student add@H_502_41@ constraint@H_502_41@ FK_TAB_STUDNET_TAB_CLASS foreign@H_502_41@ key@H_502_41@ (s_fk_id) references@H_502_41@ test_class (c_id) on@H_502_41@ delete@H_502_41@ set@H_502_41@ null@H_502_41@;@H_502_41@

select@H_502_41@ * from@H_502_41@ test_class;@H_502_41@
select@H_502_41@ * from@H_502_41@ test_student;@H_502_41@ 
delete@H_502_41@ from@H_502_41@ test_class where@H_502_41@ c_id = 1@H_502_41@;@H_502_41@

二、禁止和激活约束

禁止状态(DISABLE):当约束处于禁止状态时,即使对表的操作与约束规则相冲突,操作也会被执行。

//使失效
alter@H_502_41@ table@H_502_41@ test_student disable constraint@H_502_41@ FK_TAB_STUDNET_TAB_CLASS;@H_502_41@
//查看状态
select@H_502_41@ constraint_type,table_name,status from@H_502_41@ user_constraints where@H_502_41@ table_name = 'TEST_STUDENT'@H_502_41@;@H_502_41@

select@H_502_41@ * from@H_502_41@ test_class;@H_502_41@
select@H_502_41@ * from@H_502_41@ test_student;@H_502_41@ 
delete@H_502_41@ from@H_502_41@ test_class where@H_502_41@ c_id = 1@H_502_41@;@H_502_41@

insert@H_502_41@ into@H_502_41@ test_student (s_id,s_name,s_fk_id) values@H_502_41@ (3@H_502_41@,'TITI'@H_502_41@,3@H_502_41@);@H_502_41@



②激活状态(ENABLE):当约束处于激活状态时,如果对表的操作与约束规则相冲突,则操作会被取消。

//使有效
alter@H_502_41@ table@H_502_41@ test_student enable constraint@H_502_41@ FK_TAB_STUDNET_TAB_CLASS;@H_502_41@

//查看状态
select@H_502_41@ constraint_type,3@H_502_41@);@H_502_41@


猜你在找的Oracle相关文章