天天看點

Oracle級聯删除和級聯更新Oracle級聯删除和級聯更新

Oracle級聯删除和級聯更新

問題引入:現在有兩張表,一張是學生表students,裡面的字段為學号,姓名,班級編号;  
                        另一張表為班級表class1,裡面的字段為班級編号,班級名稱,授課教師
           兩張表建立主外鍵關系,填入資料
           删除班級表裡的一條班級資訊,如果你沒有設定級聯删除的話,那麼系統會報錯;
           

級聯删除

第一種方法

在建立表的時候通過sql代碼實作
-- 建立了CLASS表,并設定ID字段為主鍵
create table CLASS
(
  ID         VARCHAR2(2) not null,
  CLASS_NAME VARCHAR2(20)
)
alter table CLASS
add constraint PK_CLASS primary key (ID)


-- 建立了STUDENTS表,并設定ID字段為主鍵,CLASS_ID為外鍵且有級聯删除
create table STUDENTS
(
  ID       VARCHAR2(4) not null,
  CLASS_ID VARCHAR2(2) not null,
  STU_NAME VARCHAR2(20),
  STU_AGE  NUMBER
)

alter table STUDENTS
add constraint PK_STU primary key (ID)

alter table STUDENTS
add constraint FK_STU foreign key (CLASS_ID)
references CLASS (ID) on delete cascade;  -- on delete cascade,這句話就代表着級聯删除
           

第二種方法

通過快捷建表方式設定外鍵級聯删除
選擇有外鍵的那個表,然後右鍵點選編輯進入以下頁面
Oracle級聯删除和級聯更新Oracle級聯删除和級聯更新
級聯删除下拉清單下會有這幾個選項
1.1 NO ACTION
NO ACTION指當删除主表中被引用列的資料時,如果子表的引用列中包含該值,則禁止該操作執行。
現在學生外鍵級聯删除是NO ACTION,執行删除班級操作
Oracle會提示違反完整性限制: ORA-02292

1.2 SET NULL
SET NULL指當删除主表中被引用列的資料時,将子表中相應引用列的值設定為NULL值。SET NULL有個前提就是外鍵引用列必須可以
設定為NULL。
把學生表(TB_STUDENT)的外鍵删除行為改為SET NULL。ORACLE似乎沒有MODIFY CONSTRAINT操作,隻能先删除外鍵,然後建立新的。

1.3 CASCADE
CASCADE指當删除主表中被引用列的資料時,級聯删除子表中相應的資料行。
把學生表(TB_STUDENT)的外鍵删除行為改為CASCADE。
           

級聯更新

級聯更新:隻能使用觸發器來實作

觸發器的定義就是說某個條件成立的時候,觸發器裡面所定義的語句就會被自動的執行。是以觸發器不需要人為的去調用,也不能調用。

--首先建立執行個體表book和type
create table type(
tid number(4) primary key,
tname varchar2(10) not null
)
/
create table book(
bid number(4) primary key,
bname varchar2(20) not null,
tid number(4),
)
/
--建立外鍵限制
alter table book add constraint book_type foreign key(tid) references type(tid);
--插入測試資料
insert into type values(1,'曆史');
insert into type values(2,'文學');
insert into book values(1,'紅樓夢',2);
insert into book values(2,'西遊記',2);
select * from type;
select * from book;
--建立級聯更新觸發器
create or replace trigger tri_type
after update of tid  -- 在type表中的tid更新後觸發
on type
for each row
begin
-- 判斷是否相等來進行更新
if(:old.tid<>:new.tid) then
update book set tid=:new.tid where tid=:old.tid;
end if;
end;
--進行更新操作,測試觸發器是否起作用
update type set tid=3 where tid=2;