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;
②級聯删除—-使用關鍵字 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;
③置空删除—-使用關鍵字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;
二、禁止和激活限制
①禁止狀态(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);
②激活狀态(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);