2009-07-22 73 views
4

在DB2上是否有執行級聯刪除的特殊語法,還是隻能通過使用「ON DELETE CASCADE」選項定義它們來創建「級聯」表?DB2級聯刪除命令?

我試圖實現的是刪除其他表基於同一個外鍵時刪除該鍵,但這是在一個已經存在和數據填充的數據庫上完成的。

回答

8

正如你所說,你要麼必須創建FKS與ON DELETE CASCADE條款或使用子查詢,刪除前刪除其他行

所以,如果你沒有一個ON DELETE CASCADE條款你要做的

DELETE FROM ORDERS_ITEMS WHERE ORDER_ID in (
    SELECT ORDER_ID FROM ORDERS WHERE STATUS = 'Canceled' 
); 

DELETE FROM ORDERS_ADDRESS WHERE ORDER_ID in (
    SELECT ORDER_ID FROM ORDERS WHERE STATUS = 'Canceled' 
); 

DELETE FROM ORDERS WHERE STATUS = 'Canceled'; 

這很簡單,但有些多餘,所以你可以使用WITH聲明。

如果選擇所需的行的要求是相當大的,而且如果你沒有做至少RR隔離級別,你可能必須使用一個TEMPORARY table

DECLARE GLOBAL TEMPORARY TABLE TMP_IDS_TO_DELETE (ID BIGINT) NOT LOGGED; 

INSERT INTO SESSION.TMP_IDS_TO_DELETE (ID) 
    SELECT ORDER_ID FROM ORDERS WHERE STATUS = 'Canceled'; 

DELETE FROM ORDERS_ITEMS WHERE ORDER_ID in (
    SELECT ID FROM SESSION.TMP_IDS_TO_DELETE 
); 


DELETE FROM ORDERS_ADDRESS WHERE ORDER_ID in (
    SELECT ID FROM SESSION.TMP_IDS_TO_DELETE 
); 

DELETE FROM ORDERS WHERE ORDER_ID in (
    SELECT ID FROM SESSION.TMP_IDS_TO_DELETE 
); 

這方式你肯定會刪除每個表中的相同行,並且如果你錯過了某些東西,FK錯誤仍然會啓動。默認情況下,臨時表將在提交時自行清空。