DB2 cascade delete命令?

Ove*_*Lex 4 sql db2 syntax

是否有一种特殊的语法在DB2上执行级联删除,或者只能通过使用"ON DELETE CASCADE"选项定义它们来创建"可级联"表?

我想要实现的是在删除该密钥时删除基于相同外键的其他表行,但这是在已存在且数据填充的数据库上完成的.

Ste*_*epp 8

如您所述,您必须使用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错误仍然会触发.默认情况下,临时表将在提交时清空.