2009-07-22 202 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错误仍然会启动。默认情况下,临时表将在提交时自行清空。