是否有一种特殊的语法在DB2上执行级联删除,或者只能通过使用"ON DELETE CASCADE"选项定义它们来创建"可级联"表?
我想要实现的是在删除该密钥时删除基于相同外键的其他表行,但这是在已存在且数据填充的数据库上完成的.
如您所述,您必须使用ON DELETE CASCADE子句创建FK或使用subselect-delete 预删除其他行.
所以,如果你没有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';
Run Code Online (Sandbox Code Playgroud)
它很简单,但有些多余,因此您可以使用WITH语句.
如果选择所需行的请求非常大,并且您没有至少具有RR隔离级别,则可能必须使用TEMPORARY表:
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
);
Run Code Online (Sandbox Code Playgroud)
这样您就可以确保在每个表中删除相同的行,如果遗漏了某些内容,FK错误仍然会触发.默认情况下,临时表将在提交时清空.
| 归档时间: |
|
| 查看次数: |
19623 次 |
| 最近记录: |