2012-11-16 3 views
1

SQL에서 DELETE 쿼리에 대한 질문이 하나 있습니다. 나는 3 개의 자식 테이블에 B, C, D와 하나의 부모를 말합니다. A의 Priamry 키는 모든 자식 테이블에서 공유됩니다. 자식 테이블에서 레코드를 삭제 한 다음 단일 SQL에서 부모 레코드를 삭제해야하는 경우 가능합니까? 그렇다면 SQL 쿼리 구조에 대해 안내 할 수 있습니까? 그렇지 않다면 적어도 하나의 쿼리에서 하위 테이블의 레코드를 삭제할 수 있습니까?계단식 삭제를위한 단일 쿼리 구성

BEGIN; 
    DELETE FROM B WHERE ... 
    DELETE FROM C WHERE ... 
    DELETE FROM D WHERE ... 
COMMIT; 

ADDED : 당신이 ON과 함께 외부 키가없는 경우

+1

외래 키가 계단식 옵션으로 생성 된 경우 하나의 쿼리에서 가능합니다. 그렇지 않으면 DMBS에 따라 다릅니다. –

답변

0

Nahue의 읽기 의견과 sufleR의 대답이 옳다. 외래 키 관계에 ON DELETE CASCADE가 지정된 경우 단일 DELETE 문을 사용하여이 모든 테이블에서 삭제할 수 있습니다.

이 제한 사항을 적용하지 않은 경우 ALTER TABLE 문을 사용하여 시행 할 수 있습니다. 나는

ALTER TABLE b 
ADD CONSTRAINT b_a_fk 
a_fk REFERENCES a(a_pk) ON DELETE CASCADE; 

ALTER TABLE c 
ADD CONSTRAINT c_a_fk 
a_fk REFERENCES a(a_pk) ON DELETE CASCADE; 

ALTER TABLE d 
ADD CONSTRAINT d_a_fk 
a_fk REFERENCES a(a_pk) ON DELETE CASCADE; 

모든 테이블이 모든 테이블에 FOREIGN KEYON DELETE CASCADE와 참조 제한 조건을 적용 할 것,

다음
A (a_pk, ...) -- PRIMARY KEY specified on a_pk 
B (b_pk, a_fk, ...) 
C (c_pk, a_fk, ...) 
D (d_pk, a_fk, ...) 

로 스키마를 취할 것입니다. 이제

, 당신은 다음이 B, C 및 D 자신의 a_fk = <some value>의 각각의 레코드를 삭제할 것

DELETE FROM a WHERE a_pk = <some value> 

를 발행하는 경우.

내 쿼리에는 Oracle 구문이 사용되었습니다. DBMS 구문에 맞게 변환해야하지만이 구문이 표준 구문이므로 필요하지는 않습니다.