亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 數據庫 > Oracle > 正文

Oracle數據庫中的級聯查詢、級聯刪除、級聯更新操作教程

2024-08-29 13:59:00
字體:
來源:轉載
供稿:網友

級聯查詢
在ORACLE 數據庫中有一種方法可以實現級聯查詢

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

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

Oracle,數據庫,級聯查詢,級聯刪除,級聯更新

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

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

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

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

最后再補充一點關于隨機查詢的代碼

select * from user order by sys_guid()

級聯刪除

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),   --外鍵約束  --設置級聯刪除為NO ACTION  CONSTRAINT FK_TB_STUDENT_CLASS_ID FOREIGN KEY (CLASS_ID) REFERENCES TB_CLASS (ID) ); 

 
-- 添加班級數據  

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

 
-- 添加學生數據 

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); 

初始班級數據

Oracle,數據庫,級聯查詢,級聯刪除,級聯更新

初始學生數據

Oracle,數據庫,級聯查詢,級聯刪除,級聯更新

NO ACTION:

NO ACTION指當刪除主表中被引用列的數據時,如果子表的引用列中包含該值,則禁止該操作執行。
現在學生外鍵級聯刪除是NO ACTION,執行刪除班級操作。

--刪除三班 

DELETE FROM TB_CLASS WHERE ID=3; 

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

Oracle,數據庫,級聯查詢,級聯刪除,級聯更新

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

DELETE FROM TB_STUDENT WHERE CLASS_ID=3; 

--刪除三班 

DELETE FROM TB_CLASS WHERE ID=3; 

SET NULL:

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

--刪除學生表(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被設置為NULL,如圖所示。

Oracle,數據庫,級聯查詢,級聯刪除,級聯更新

CASCADE

CASCADE指當刪除主表中被引用列的數據時,級聯刪除子表中相應的數據行。
把學生表(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,所以當刪除二班時,二班下的學生也會被刪除。


級聯更新

Oracle本身并不支持外鍵的級聯更新,不過可以按照如下方法達到級聯更新的效果。
首先要先了解Oracle延遲約束和非延遲約束。非延遲約束就是在修改記錄的時候會立刻進行約束條件的查看,是否因為違反了某些約束條件而不能執行修改。延遲約束不會在剛進行修改的時候進行約束查看,只有提交的時候才會檢查。Oracle的級聯更新就是使用這個特性來實現的。
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; 

設置觸發器,當班級表(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外鍵級聯更新方法可以用于外鍵和外鍵引用的主鍵在不同表上。不過會經常遇到以下情況,就是在數據庫中保存具有層級關系的數據時,表的外鍵引用同一個表的主鍵。這時候無法用觸發器實現級聯更新。


注:相關教程知識閱讀請移步到oracle教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美在线视频播放| 91精品国产91久久| 亚洲精品v欧美精品v日韩精品| 国产精品偷伦免费视频观看的| 久久影院在线观看| 国产欧美一区二区三区久久人妖| 91综合免费在线| 国语对白做受69| 欧美猛交免费看| 国产精品免费视频久久久| 国产美女高潮久久白浆| 亚洲欧美激情在线视频| 日韩女优在线播放| 91国产精品电影| 国产精品极品美女粉嫩高清在线| 欧美成aaa人片在线观看蜜臀| 国产精品自拍偷拍| 国产精品爽爽爽爽爽爽在线观看| 国产精品永久免费在线| 欧洲中文字幕国产精品| 国产99久久精品一区二区永久免费| 国产va免费精品高清在线观看| 亚洲国产精品99久久| 日韩av大片在线| 国内精品久久久久久久久| 欧美激情在线有限公司| 成人免费在线视频网址| 国产福利精品av综合导导航| 精品亚洲一区二区三区在线观看| 亚洲国产精品美女| 韩剧1988免费观看全集| 亚洲一区二区免费| 精品国产区一区二区三区在线观看| 亚洲欧美日韩区| 成人网中文字幕| 一区二区在线视频| 国产精品成人va在线观看| 亚洲肉体裸体xxxx137| 日韩av电影在线播放| 久久久精品日本| www.日韩免费| 日韩av在线免费播放| 黑人巨大精品欧美一区二区| 国产精品一香蕉国产线看观看| 亚洲最大福利视频网站| 亚洲最大福利视频| 亚洲伊人久久大香线蕉av| 日本人成精品视频在线| 成人久久一区二区| 青草青草久热精品视频在线网站| 欧美成人在线免费| 91香蕉亚洲精品| 国产美女被下药99| 欧美性极品少妇精品网站| 亚洲美女久久久| 俺去啦;欧美日韩| 欧美极品少妇xxxxx| 亚洲精品白浆高清久久久久久| 日韩小视频在线观看| 久久偷看各类女兵18女厕嘘嘘| 久久影视电视剧免费网站清宫辞电视| 久久精品国产99国产精品澳门| 亚洲精品999| 九九九热精品免费视频观看网站| 精品中文字幕视频| 欧美不卡视频一区发布| 久久久久国产精品免费| 亚洲最大av在线| 亚洲欧洲xxxx| 亚洲国产精品久久久久秋霞蜜臀| 亚洲综合av影视| 成人黄色免费网站在线观看| 热草久综合在线| 日韩资源在线观看| 亚洲视频在线看| 日韩精品在线免费观看视频| 欧美一级淫片播放口| 午夜免费在线观看精品视频| 最新69国产成人精品视频免费| 日韩精品一区二区视频| 亚洲精品美女在线| 中文字幕日韩免费视频| 欧美一区二区三区……| 91在线高清免费观看| 欧美精品videofree1080p| 久久91精品国产91久久久| 久久伊人精品一区二区三区| 国产亚洲福利一区| 亚洲精品电影在线观看| 亚洲第一色中文字幕| 日韩av在线影视| 北条麻妃一区二区在线观看| 亚洲欧美三级在线| 伊人久久男人天堂| 国产一区二区黑人欧美xxxx| 色综合久久88| 91免费看视频.| 日韩中文字幕av| 久久久久久久久久久免费精品| 亚洲人av在线影院| 两个人的视频www国产精品| 综合网日日天干夜夜久久| 97精品久久久中文字幕免费| 欧美性videos高清精品| 最近免费中文字幕视频2019| 欧美另类交人妖| 亚洲国产中文字幕在线观看| 亚洲电影免费观看高清完整版在线观看| 午夜美女久久久久爽久久| 国产精品一二三视频| 国产精品美女网站| 91丝袜美腿美女视频网站| 亚洲人午夜精品| 伊人激情综合网| 国产精品一区二区久久精品| 亚洲一区二区三区在线免费观看| www.欧美视频| 欧美xxxx做受欧美| 亚洲理论片在线观看| 国产精品狼人色视频一区| 亚洲在线www| 精品国产乱码久久久久酒店| 成人性教育视频在线观看| 亚洲日本中文字幕免费在线不卡| 狠狠久久亚洲欧美专区| 欧美高清理论片| 国产国语videosex另类| 久久偷看各类女兵18女厕嘘嘘| 日韩欧美大尺度| 最近2019中文免费高清视频观看www99| 亚洲美女视频网| 国产香蕉精品视频一区二区三区| 成人a在线观看| 欧美午夜美女看片| 日日狠狠久久偷偷四色综合免费| 国产成人高清激情视频在线观看| 综合网日日天干夜夜久久| 国产在线播放91| 91免费视频国产| 亚洲精品美女在线观看| 国产成人精品一区二区三区| 97国产精品免费视频| 国产精品日韩专区| 国产91热爆ts人妖在线| 色婷婷久久一区二区| 色诱女教师一区二区三区| 亚洲国产古装精品网站| 国产欧美韩国高清| 欧美激情综合亚洲一二区| 7m第一福利500精品视频| 91久久久久久久久久久| 中文字幕不卡在线视频极品| 日韩精品中文字幕久久臀| 最新69国产成人精品视频免费| 亚洲电影av在线| 亚洲xxx自由成熟| 在线精品视频视频中文字幕| 91久久精品久久国产性色也91| 久久99久久亚洲国产| 一区二区欧美在线| 日本久久91av| 粉嫩老牛aⅴ一区二区三区| 国产精品九九久久久久久久| 欧美专区在线视频|