刪除商品時,需同步刪除:購物車項、訂單明細、訂單主表,以及該訂單關聯的其他明細。表關系復雜、數據量大、未建立外鍵級聯刪除約束。
ALTER TABLE child_table
ADD CONSTRAINT fk_parent
FOREIGN KEY (parent_id) REFERENCES parent_table(id)
ON DELETE CASCADE;
優點:數據庫層面保證一致性,性能最優,代碼零侵入。
缺點:需修改表結構,生產環境風險大,歷史數據可能違反約束導致創建失敗。
-- 1. 刪除舊約束
ALTER TABLE child_table DROP CONSTRAINT fk_old;
-- 2. 添加級聯約束 (NOVALIDATE 跳過現有數據校驗)
ALTER TABLE child_table ADD CONSTRAINT fk_new
FOREIGN KEY (parent_id) REFERENCES parent_table(id)
ON DELETE CASCADE NOVALIDATE;
-- 3. 執行刪除操作
DELETE FROM parent_table WHERE id = ...;
-- 4. (可選) 恢復原約束
利用 NOVALIDATE 避免海量歷史數據校驗鎖表,操作完成後可還原約束。
CREATE OR REPLACE TRIGGER trg_cascade_del
BEFORE DELETE ON parent_table
FOR EACH ROW
BEGIN
DELETE FROM child_table WHERE parent_id = :OLD.id;
DELETE FROM grand_child_table WHERE order_id IN (SELECT id FROM child_table WHERE parent_id = :OLD.id);
-- 可編寫任意複雜 PL/SQL 邏輯
END;
優點:不依賴外鍵,邏輯集中在數據庫層,支持非主鍵關聯、跨 Schema、條件刪除等複雜場景。
注意:避免觸發器嵌套過深導致 ORA-04091 變異表錯誤。
若僅涉及 1-2 張表、數據量小(< 1 萬行),Service 層事務中按順序 DELETE 最直觀,無隱式邏輯,易調試。