cascade 外來鍵完整性約束

2021-08-31 04:53:23 字數 2143 閱讀 3647

其面我們介紹了

建立外來鍵約束時如果使用oracle預設的建立方式

, 在刪除被參照的資料時,將無法被刪除,這一點在oracle9i中給了我們更多靈活的選擇,我們可是使用on delete cascade和 on delete set null關鍵字來決定刪除被參照資料時是否要將參照這個資料的那些資料一併刪除,還是將那些參照這條資料的資料的對應值賦空。(被參照資料:主鍵的表上的資料  參照資料:外來鍵上表的資料)

只是對被參照資料的操作級聯(參照資料),沒有對參照資料級聯(被參照資料)

例如下面這兩個表中分別存的時員工的基本資訊和公司的部門資訊。我們為

create table dept

(deptno number(10) not null,

deptname varchar2(30) not null,

constraint pk_dept primary key(deptno));

和create table emp

( empno number(10) not null,

fname varchar2(20) ,

lname varchar2(20) ,

dept number(10) ,

constraint pk_emp primary key(empno));

然後我們現在分別使用這兩個關鍵字來增加外來鍵試一下,首先我們來試一下on delete cascade

alter table emp

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

先增加外來鍵。然後插入資料。

insert into dept values(1,』銷售部』);

insert into dept values(2,』財務部』);

insert into emp values (2,』mary』,'song』,1);

insert into emp values (3,』linda』,'liu』,2);

insert into emp values (4,』linlin』,'zhang』,1);

然後現在我要刪除銷售部,會有什麼後果呢?

delete from dept where deptno = 1;

我們發現除了dept中的一條資料被刪除了,emp中兩條資料也被刪除了,其中emp中的兩條資料是參照了銷售部的這條資料的,這就很容易理解on delete cascade了。

接下來我們再來看on delete set null,顧名思義了,這種方式建立的外來鍵約束,當被參照的資料被刪除是,參照該資料的那些資料的對應值將會變為空值,下面我們還是通過試驗來證明on delete set null作用:

首先恢復剛才的那幾條資料,然後更改約束:

alter table emp

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

然後我們在執行刪除操作:

delete from dept where deptno = 1;

你也會發現除了dept中的銷售部被刪除以外,emp中參照這條資料的兩條資料的dept的值被自動賦空了,這就是on delete set null的作用了。

使用on delete set null有一點需要注意的是,被參參照其他表的那一列必須能夠被賦空,不能有

not null約束

, 對於上面的例子來說是emp中dept列一定不能有not null約束,如果已經定義了not null約束,又使用了on delete set null來刪除被參照的資料時,將會發生:ora-01407: 無法更新 (」dd」.」emp」.」dept」) 為 null的錯誤。

總的來講on delete cascade和on delete set null的作用是用來處理級聯刪除問題的,如果你需要刪除的資料被其他資料所參照,那麼你應該決定到底希望oracle怎麼處理那些參照這些即將要刪除資料的資料的,你可以有三種方式:

禁止刪除。這也是oracle預設的

將那些參照本值的資料的對應列賦空,這個需要使用on delete set null關鍵字

將那些參照本值的資料一併刪除,這個需要使用on delete cascade關鍵字

表的完整性約束 外來鍵約束

先建立父表 部門表 create table department dno int 4 primary key auto increment,dname varchar 10 not null,room char 4 注意 外來鍵約束只有表級約束,沒有列級約束 方法一 建立表的時候新增外來鍵約束 c...

表的完整性約束 外來鍵約束

先建立父表 部門表 create table department dno int 4 primary key auto increment,dname varchar 10 not null,room char 4 注意 外來鍵約束只有表級約束,沒有列級約束 方法一 建立表的時候新增外來鍵約束 c...

完整性約束

create table student tb id int notnull 非空約束 資料不允許為空 name varchar 255 null 顯式指定允許為空 新增非空約束 alter table 表名 modify column 屬性名 屬性型別 not null alter table s...