【问题标题】:DB2 cascade delete command?DB2 级联删除命令?
【发布时间】:2009-07-22 10:16:47
【问题描述】:

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

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

【问题讨论】:

    标签: sql syntax db2


    【解决方案1】:

    正如您所说,您必须使用ON DELETE CASCADE 子句创建 FK,或者使用子选择删除预删除其他行

    所以,如果你没有 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 隔离级别,则可能必须使用 @ 987654322@:

    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 错误仍然会触发。默认情况下,临时表会在提交时自行清空。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-04-24
      • 1970-01-01
      • 1970-01-01
      • 2011-06-29
      • 2010-10-05
      • 2011-09-21
      • 2012-02-27
      • 2012-09-08
      相关资源
      最近更新 更多