首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Oracle 觸發器級聯刪除:父子表外鍵關聯下的正確刪除順序

     編輯:程式設計綜合問答

問題描述

在 Oracle 數據庫專案中,需實現父表 course 與子表 teacou 的級聯刪除。外鍵關係為 teacou.cid 關聯 course.id。刪除父表記錄前,必須先清理子表對應數據,但在觸發器中刪除子表後,似乎無法再獲取父表的 id 值,導致邏輯卡住。

原因分析

觸發器執行時機為關鍵。若在 AFTER DELETE 觸發器中操作,父表記錄已刪除,:old.id 雖可用但事務可能已提交;若在 BEFORE DELETE 中先刪子表,父表記錄尚存在,:old.id 完全可用。問題在於查詢子表可能返回多行,導致 SELECT INTO 報錯。

最佳實踐

使用 BEFORE DELETE FOR EACH ROW 觸發器,配合隱式游標或顯式游標批量刪除子表數據:

CREATE OR REPLACE TRIGGER trg_del_course_cascade
BEFORE DELETE ON course
FOR EACH ROW
BEGIN
  DELETE FROM teacou WHERE tId = :old.id;
END;

單條 DELETE 即可處理多行子記錄,無需游標循環,效能更優。Oracle 會在觸發器執行完後自動刪除父表記錄,外鍵約束自動驗證。

圖示說明

延伸閱讀

參考經典教程:Oracle 觸發器級聯刪除完整指南

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved