4
在DB2上是否有執行級聯刪除的特殊語法,還是隻能通過使用「ON DELETE CASCADE」選項定義它們來創建「級聯」表?DB2級聯刪除命令?
我試圖實現的是刪除其他表基於同一個外鍵時刪除該鍵,但這是在一個已經存在和數據填充的數據庫上完成的。
在DB2上是否有執行級聯刪除的特殊語法,還是隻能通過使用「ON DELETE CASCADE」選項定義它們來創建「級聯」表?DB2級聯刪除命令?
我試圖實現的是刪除其他表基於同一個外鍵時刪除該鍵,但這是在一個已經存在和數據填充的數據庫上完成的。
正如你所說,你要麼必須創建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錯誤仍然會啓動。默認情況下,臨時表將在提交時自行清空。