2009-07-22 5 views
4

DB2에서 계단식 삭제를 실행하는 특수 구문이 있습니까? 아니면 "ON DELETE CASCADE"옵션을 사용하여 "계단식"테이블을 정의하는 것만 가능합니까?DB2 계단식 삭제 명령?

내가 달성하려고하는 것은 같은 키를 삭제할 때 동일한 외래 키를 기반으로 다른 테이블 행을 삭제하는 것이지만 이미 기존의 데이터가 채워진 데이터베이스에서 수행됩니다. 당신이 언급 한 바와 같이

답변

8

, 당신이 중 하나는 ON DELETE CASCADE 절 FKS을 만들거나 에 부속 - 삭제와 다른 행을을 미리 삭제 에 있습니다. 당신이 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 오류가 계속 발생합니다. 기본적으로, 임시 테이블은 커밋시 자체를 비 웁니다.

관련 문제