主頁 > 知識庫 > Oracle數(shù)據(jù)庫中的級聯(lián)查詢、級聯(lián)刪除、級聯(lián)更新操作教程

Oracle數(shù)據(jù)庫中的級聯(lián)查詢、級聯(lián)刪除、級聯(lián)更新操作教程

熱門標簽:慧營銷crm外呼系統(tǒng)丹丹 開發(fā)外呼系統(tǒng) 哪個400外呼系統(tǒng)好 地圖標注養(yǎng)老院 山東crm外呼系統(tǒng)軟件 愛客外呼系統(tǒng)怎么樣 哈爾濱電話機器人銷售招聘 百度地圖標注途經(jīng)點 圖吧網(wǎng)站地圖標注

級聯(lián)查詢
在ORACLE 數(shù)據(jù)庫中有一種方法可以實現(xiàn)級聯(lián)查詢

select *    //要查詢的字段
from table    //具有子接點ID與父接點ID的表 
start with selfid=id  //給定一個startid(字段名為子接點ID,及開始的ID號)
connect by prior selfid=parentid  //聯(lián)接條件為子接點等于父接點,不能反

這個SQL主要用于菜單的級聯(lián)查詢,給一個父接點可以查出所有的子接點。及子接點的子接點,一查到底,很實用。不過呢這個程序只能在oracle里面用,我目前還不知道在其它數(shù)據(jù)庫里是怎么調(diào)用的。等我找到了,再貼出來與大家分享。
這個程序,估計好多人看不明白,其實放了這么久我也一時沒看明白,重新測了一下,補充說明一下,不然我下次又看不懂了。
以一個windows系統(tǒng)的菜單為例。我那一個這樣的表menu。
說明:
mid:菜單的ID號
mname:菜單名稱
mpid:菜單的
quickey:快捷鍵
validate:權(quán)限表(存放userid,或者角色id)

如果我想知道在“文件”菜單下有那些子菜單的話。我就可以這樣用這個SQL程序:

select * from menu
start with mid=1  
connect by prior mid=mpid;

這樣就可以把 “文件”里的子菜單全部列出來了。當然實際應用不會這么簡單,如附加其實條件,尤其是權(quán)限管理,這時根據(jù)你的系統(tǒng)要求,是對個個驗證,還是對角色驗證,把這些人的ID放在validate這個字段里,組成一個字符串,N個ID用逗號隔開,(注意,在往數(shù)據(jù)庫保存時要注意對字符串處理一下,截取掉最后一個逗號這樣可以節(jié)省很多麻煩)

select * from menu
where validate in(……)
and mid in(
 select mid from menu //這里不能用*號了。
 start with mid=1  
 connect by prior mid=mpid;
)

最后再補充一點關(guān)于隨機查詢的代碼

select * from user order by sys_guid()

級聯(lián)刪除

Oracle在外鍵的刪除上有NO ACTION(類似RESTRICT)、CASCADE和SET NULL三種行為。
下面以學生-班級為例說明不同情況下的外鍵刪除,學生屬于班級,班級的主鍵是學生的外鍵。
-- 班級表  

CRATE TABLE TB_CLASS 
( 
 ID NUMBER NOT NULL, --班級主鍵 
 NAME VARCHAR2(50), --班級名稱 
 CONSTRAINT PK_TB_CLASS PRIMARY KEY (ID) 
); 

 
-- 學生表  

CREATE TABLE TB_STUDENT 
( 
 ID  NUMBER NOT NULL, --學生主鍵 
 NAME  VARCHAR2(50),  --學生姓名 
 CLASS_ID NUMBER,   --學生所屬班級,外鍵 
 
 --主鍵約束 
 CONSTRAINT PK_TB_STUDENT PRIMARY KEY (ID), 
 
 --外鍵約束 
 --設(shè)置級聯(lián)刪除為NO ACTION 
 CONSTRAINT FK_TB_STUDENT_CLASS_ID FOREIGN KEY (CLASS_ID) REFERENCES TB_CLASS (ID) 
); 

 
-- 添加班級數(shù)據(jù)  

INSERT INTO TB_CLASS (ID, NAME) VALUES (1, '一班'); 
INSERT INTO TB_CLASS (ID, NAME) VALUES (2, '二班'); 
INSERT INTO TB_CLASS (ID, NAME) VALUES (3, '三班'); 

 
-- 添加學生數(shù)據(jù) 

INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (1, '小明', 1); 
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (2, '小剛', 1); 
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (3, '小王', 1); 
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (4, '二明', 2); 
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (5, '二剛', 2); 
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (6, '二王', 2); 
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (7, '大明', 3); 
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (8, '大剛', 3); 
INSERT INTO TB_STUDENT (ID, NAME, CLASS_ID) VALUES (9, '大王', 3); 

初始班級數(shù)據(jù)

初始學生數(shù)據(jù)

NO ACTION:

NO ACTION指當刪除主表中被引用列的數(shù)據(jù)時,如果子表的引用列中包含該值,則禁止該操作執(zhí)行。
現(xiàn)在學生外鍵級聯(lián)刪除是NO ACTION,執(zhí)行刪除班級操作。

--刪除三班 

DELETE FROM TB_CLASS WHERE ID=3; 

Oracle會提示違反完整性約束,如圖所示。

如果想要刪除三班,必須先刪除三班的學生。
--刪除三班學生 

DELETE FROM TB_STUDENT WHERE CLASS_ID=3; 

--刪除三班 

DELETE FROM TB_CLASS WHERE ID=3; 

SET NULL:

SET NULL指當刪除主表中被引用列的數(shù)據(jù)時,將子表中相應引用列的值設(shè)置為NULL值。SET NULL有個前提就是外鍵引用列必須可以設(shè)置為NULL。
把學生表(TB_STUDENT)的外鍵刪除行為改為SET NULL。ORACLE似乎沒有MODIFY CONSTRAINT操作,只能先刪除外鍵,然后創(chuàng)建新的。

--刪除學生表(TB_STUDENT)表的外鍵 

ALTER TABLE TB_STUDENT DROP CONSTRAINT FK_TB_STUDENT_CLASS_ID; 

--刪除添加ON DELETE SET NULL外鍵  

 
復制代碼 代碼如下:

ALTER TABLE TB_STUDENT ADD CONSTRAINT FK_TB_STUDENT_CLASS_ID FOREIGN KEY (CLASS_ID) REFERENCES TB_CLASS (ID) ON DELETE SET NULL; 

--刪除一班 
DELETE FROM TB_CLASS WHERE ID=1; 

由于外鍵的ON DELETE是SET NULL,所以當刪除一班時,一班學生的CLASS_ID被設(shè)置為NULL,如圖所示。

CASCADE

CASCADE指當刪除主表中被引用列的數(shù)據(jù)時,級聯(lián)刪除子表中相應的數(shù)據(jù)行。
把學生表(TB_STUDENT)的外鍵刪除行為改為CASCADE。

--刪除TB_STUDENT表上的NO ACTION外鍵 

ALTER TABLE TB_STUDENT DROP CONSTRAINT FK_TB_STUDENT_CLASS_ID; 

--刪除添加ON DELETE CASCADE外鍵  

ALTER TABLE TB_STUDENT ADD CONSTRAINT FK_TB_STUDENT_CLASS_ID FOREIGN KEY (CLASS_ID) REFERENCES TB_CLASS (ID) ON DELETE CASCADE; 

 
--刪除二班 

DELETE FROM TB_CLASS WHERE ID=2; 

由于外鍵的ON DELETE是CASCADE,所以當刪除二班時,二班下的學生也會被刪除。


級聯(lián)更新

Oracle本身并不支持外鍵的級聯(lián)更新,不過可以按照如下方法達到級聯(lián)更新的效果。
首先要先了解Oracle延遲約束和非延遲約束。非延遲約束就是在修改記錄的時候會立刻進行約束條件的查看,是否因為違反了某些約束條件而不能執(zhí)行修改。延遲約束不會在剛進行修改的時候進行約束查看,只有提交的時候才會檢查。Oracle的級聯(lián)更新就是使用這個特性來實現(xiàn)的。
Oracle的外鍵默認是非延遲約束,修改學生的外鍵為延遲約束。

--刪除學生表(TB_STUDENT)上的已有外鍵 

ALTER TABLE TB_STUDENT DROP CONSTRAINT FK_TB_STUDENT_CLASS_ID; 

--添加延遲約束外鍵 

ALTER TABLE TB_STUDENT ADD CONSTRAINT FK_TB_STUDENT_CLASS_ID FOREIGN KEY (CLASS_ID) REFERENCES TB_CLASS (ID) ON DELETE CASCADE DEFERRABLE; 

設(shè)置觸發(fā)器,當班級表(TB_CLASS)的主鍵改變了,就更新學生表(TB_STUDENT)的外鍵(CLASS_ID)。

CREATE OR REPLACE TRIGGER TGR_TB_CLASS_UPDATE 
AFTER UPDATE OF ID ON TB_CLASS 
FOR EACH ROW 
BEGIN 
 IF :OLD.ID>:NEW.ID THEN 
 UPDATE TB_STUDENT SET CLASS_ID=:NEW.ID WHERE CLASS_ID=:OLD.ID; 
 END IF; 
END; 

注意:
Oracle外鍵級聯(lián)更新方法可以用于外鍵和外鍵引用的主鍵在不同表上。不過會經(jīng)常遇到以下情況,就是在數(shù)據(jù)庫中保存具有層級關(guān)系的數(shù)據(jù)時,表的外鍵引用同一個表的主鍵。這時候無法用觸發(fā)器實現(xiàn)級聯(lián)更新。

您可能感興趣的文章:
  • oracle數(shù)據(jù)庫的刪除方法詳解
  • Oracle刪除數(shù)據(jù)報ORA 02292錯誤的巧妙解決方法
  • oracle 數(shù)據(jù)按主鍵刪除慢問題的解決方法
  • Oracle刪除重復的數(shù)據(jù),Oracle數(shù)據(jù)去重復
  • Oracle誤刪除表數(shù)據(jù)后的數(shù)據(jù)恢復詳解
  • 徹底刪除Oracle數(shù)據(jù)庫的方法
  • oracle查詢重復數(shù)據(jù)和刪除重復記錄示例分享
  • oracle數(shù)據(jù)庫添加或刪除一列的sql語句
  • oracle 批量刪除表數(shù)據(jù)的幾種方法

標簽:甘肅 青島 承德 開封 固原 和田 周口 武漢

巨人網(wǎng)絡通訊聲明:本文標題《Oracle數(shù)據(jù)庫中的級聯(lián)查詢、級聯(lián)刪除、級聯(lián)更新操作教程》,本文關(guān)鍵詞  Oracle,數(shù)據(jù)庫,中的,級聯(lián),;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《Oracle數(shù)據(jù)庫中的級聯(lián)查詢、級聯(lián)刪除、級聯(lián)更新操作教程》相關(guān)的同類信息!
  • 本頁收集關(guān)于Oracle數(shù)據(jù)庫中的級聯(lián)查詢、級聯(lián)刪除、級聯(lián)更新操作教程的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章