在 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 觸發器級聯刪除完整指南