以下的文章主要是對Oracle主鍵與Oracle外鍵的實際應用方案的介紹此篇文章是我很然偶在一網站上發現的如果你對Oracle主鍵與Oracle外鍵的實際應用很感興趣的話以下的文章就會給你提供更詳細的相關方面的知識
CREATE TABLE SCOTTMID_A_TAB
( A VARCHAR( BYTE)
B VARCHAR( BYTE)
DETPNO VARCHAR( BYTE)
)TABLESPACE USERS ;
CREATE TABLE SCOTTMID_B_TAB
( A VARCHAR( BYTE)
B VARCHAR( BYTE)
DEPTNO VARCHAR( BYTE)
)TABLESPACE USERS ;
給MID_A_TAB表添加主鍵
alter table mid_a_tab add constraint a_pk primary key (detpno);
給MID_B_TAB表添加Oracle主鍵
alter table mid_b_tab add constraint b_pk primary key(a);
給子表MID_B_TAB添加Oracle外鍵並且引用主表MID_A_TAB的DETPNO列並通過on delete cascade指定引用行為是級聯刪除
alter table mid_b_tab add constraint b_fk foreign key
(deptno) references mid_a_tab (detpno) on delete cascade;
向這樣就創建了好子表和Oracle主表
向主表添加數據記錄
SQL> insert into mid_a_tab(abdetpno) values();
已創建 行
已用時間: : :
向子表添加數據
SQL> insert into mid_b_tab(abdeptno) values();
insert into mid_b_tab values()
*
第 行出現錯誤:
ORA: 違反唯一約束條件 (SCOTTB_PK)
已用時間: : :
可見上面的異常信息那時因為子表插入的deptno的值是然而此時我們主表中
detpno列只有一條記錄那就是所以當子表插入數據時在父表中不能夠找到該引用
列的記錄所以出現異常
但我們可以這樣對子表的數據的進行插入(即在子表的deptno列插入null因為我們在建表的時候
並沒有對該列進行not null的約束限制)
SQL> insert into mid_b_tab(abdeptno) values(null);
已創建 行
已用時間: : :
現在如果我們把子表mid_b_tab中deptno列加上not null約束
SQL> alter table mid_b_tab modify deptno not null;
alter table mid_b_tab modify deptno not null
*
第 行出現錯誤:
ORA: 無法啟用 (SCOTT) 找到空值
已用時間: : :
上面又出現異常這是因為現在mid_b_tab表中有了一條記錄就是我們先前添加的
那條記錄
null
現在我們要把該表的deptno列進行not null約束限制所以Oracle不讓我們這樣干
那我們就只有把該表給delete或truncate掉然後在修改deptno列為非空
SQL> delete from mid_b_tab;
已刪除行
已用時間: : :
再次修改子表mid_b_tab表的deptno列為非空
SQL> alter table mid_b_tab modify deptno not null;
表已更改
已用時間: : :
修改成功!
我們再次插入數據
insert into mid_b_tab(abdeptno) values(null);
試試
SQL> insert into mid_b_tab(abdeptno) values(null);
insert into mid_b_tab(abdeptno) values(null)
*
第 行出現錯誤:
ORA: 無法將 NULL 插入 (SCOTTMID_B_TABDEPTNO)
已用時間: : :
看見現在Oracle不讓我們插入空值了
所以我們在創建子表的Oracle外鍵約束時該表的引用列必須要進行not null限制也可以在
該列創建unique或primary key約束並且引用列與被引用列的數據類型必須相同
SQL> insert into mid_b_tab(abdeptno) values();
已創建 行
已用時間: : :
此時數據插入成功因為此時插入的在主表中的被引用列中已經存在了
現在我們一系列的操作
SQL> select * from mid_b_tab ;
A B DE
已用時間: : :
SQL> select * from mid_a_tab;
A B DE
已用時間: : :
SQL> delete from mid_a_tab;
已刪除 行
已用時間: : :
From:http://tw.wingwit.com/Article/program/Oracle/201311/18331.html