天天看點

【Oracle學習】之 外鍵限制(3種删除-詳細)與 限制激活(失效)

Q:删除主表記錄(子表外鍵存在下),3種删除方式?

A:①預設删除(default) ②級聯删除 ③置空删除。具體操作見下文

主表和子表的概念:

如果表中定義了外鍵限制,那麼該表通常被稱為子表,例如下文的test_student表

如果表中包含引用鍵,那麼該表被稱為父表,例如test_class表

一、外鍵删除

①預設删除—-即什麼都不加 或 使用 no action關鍵字

簡介:如果在定義外鍵限制時使用no action關鍵字,那麼當父表中被引用列的資料被删除時,将違反外鍵限制,改操作也将被禁止執行,這也是外鍵限制的預設引用類型。

//檢視test_student 有哪些限制
select constraint_type, table_name from user_constraints where table_name = 'TEST_STUDENT';

//添加限制
alter table test_student add constraint FK_TAB_STUDNET_TAB_CLASS foreign key (s_fk_id) references

select * from
select * from 
delete from test_class where c_id = 1;      
【Oracle學習】之 外鍵限制(3種删除-詳細)與 限制激活(失效)
【Oracle學習】之 外鍵限制(3種删除-詳細)與 限制激活(失效)

②級聯删除—-使用關鍵字 cascade

簡介:如果在定義外鍵限制時使用cascade關鍵字,那麼當父表中被引用列的資料被删除時,子表中對應的資料也将被删除。

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

select * from
select * from 
delete from test_class where c_id = 1;      
【Oracle學習】之 外鍵限制(3種删除-詳細)與 限制激活(失效)

③置空删除—-使用關鍵字set null

簡介:如果在定義外鍵限制時使用set null關鍵字,那麼當主表中被引用列的資料被删除時,子表中對應的資料被設定為null。要使這個關鍵字起作用,子表中的對應列必須支援NULL值。

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

select * from
select * from 
delete from test_class where c_id = 1;      
【Oracle學習】之 外鍵限制(3種删除-詳細)與 限制激活(失效)

二、禁止和激活限制

①禁止狀态(DISABLE):當限制處于禁止狀态時,即使對表的操作與限制規則相沖突,操作也會被執行。

//使失效
alter table test_student disable constraint
//檢視狀态
select constraint_type, table_name, status from user_constraints where table_name = 'TEST_STUDENT';

select * from
select * from 
delete from test_class where c_id = 1;

insert into test_student (s_id, s_name, s_fk_id) values (3, 'TITI', 3);      
【Oracle學習】之 外鍵限制(3種删除-詳細)與 限制激活(失效)
【Oracle學習】之 外鍵限制(3種删除-詳細)與 限制激活(失效)
【Oracle學習】之 外鍵限制(3種删除-詳細)與 限制激活(失效)

②激活狀态(ENABLE):當限制處于激活狀态時,如果對表的操作與限制規則相沖突,則操作會被取消。

//使有效
alter table test_student enable constraint

//檢視狀态
select constraint_type, table_name, status from user_constraints where table_name = 'TEST_STUDENT';

select * from
select * from 
delete from test_class where c_id = 1;

insert into test_student (s_id, s_name, s_fk_id) values (3, 'TITI', 3);      
【Oracle學習】之 外鍵限制(3種删除-詳細)與 限制激活(失效)