關於外來鍵的理解和實驗步驟

shilei1發表於2012-04-27

我的實驗過程
1.建立兩個表
create table zb(n number not null primary key,b varchar2(10),c date default sysdate);
create table wb(n number not null primary key references zb(n),c date default sysdate);
2.給zb及wb分別insert into資料
insert into zb(n,b) values(3,'c');

insert into wb(n) values(1);

當給外表insert into上面三行(即與主表一樣的n號時,系統沒問題,錯誤產生)
當insert into 不相同的n號時
如:
insert into wb(n) values(4);
insert into wb(n) values(4)
Error at line 1
ORA-02291: integrity constraint (CSM.SYS_C00204894) violated - parent key not found

Script. Terminated on line 4.

說父表中沒有資料發現。

說明什麼,要麼wb的行數少於zb的,要麼最多和zb的行數一樣多。
也就是說wb的n列,必須是zb的n列號碼的子集。

3.測一下關於刪除的例子:
delete from zb where n=1;
delete from zb where n=1
Error at line 1
ORA-02292: integrity constraint (CSM.SYS_C00204894) violated - child record found

Script. Terminated on line 5.

說明是互相約束的,如果刪除zb即父表的行,那個n列中的值如果在wb中,那就出現上面的錯誤,
如果不在,即:
insert into zb(n,b) values(5,'c');
commit;

這個n=5不在wb中
即,再測試:
delete from zb where n=5;
1 row deleted.

說明是可以刪除的

4.如何解決上述錯誤?
解決辦法:
1.create table wb(n number not null primary key references zb(n) on  delete cascade,c date default sysdate);
建立一個加on delete cascade引數的外來鍵


給表插入上面的資料。
2.刪除zb(即父表中的資料,n號在wb中)
delete from zb where n=2;
1 row deleted.
這說明這樣是可以刪除的。
叉插入的情況(主要測試wb)
插入依舊要遵守規則 ,在子表即wb中的行n號碼,是zb中的n號的子集才成,如果不是,系統拒絕插入。

另:
如果外來鍵的定義中沒有on delete cascade引數
則刪除zb的行,n的號在wb中的n號的話,則需要先刪除wb中的相應的行,才能刪除zb的行。


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/196700/viewspace-722365/,如需轉載,請註明出處,否則將追究法律責任。

相關文章