如您所述,您要么必须 创建带有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';
它很简单,但是有点多余,因此您可以使用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);
这样,您可以确定将 删除每个表中的相同行 ,并且如果遗漏某些内容,仍然会触发FK错误。默认情况下,临时表将在提交时将自身清空。



