是否有特殊的语法来在 DB2 上执行级联删除,或者是否只能通过使用“ON DELETE CASCADE”选项定义它们来创建“可级联”表?
我想要实现的是,当我删除该键时,删除基于相同外键的其他表行,但这是在已经存在且填充数据的数据库上完成的。
正如你所说,你要么必须创建 FKON 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 http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=/com.ibm.db29.doc.apsg/db2z_createcte.htmstatement陈述。
如果选择所需行的请求很大,并且如果你没有至少一个RR隔离级别,你可能需要使用临时表 http://www.cs.newpaltz.edu/~pletcha/DB/db2_TempTables.html :
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 错误。默认情况下,临时表将在提交时清空自身。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)