2009-07-07 8 views
2

퀴즈 ID와 일치하는 모든 레코드를 질문 테이블과 관계 테이블에서 삭제하려고합니다. 쿼리는 select 문에 대해 작동하지만 동일한 문을 삭제할 수 없습니다.관련 테이블에서 SQL 삭제

@quizId은 내 저장 프로 시저에 전달하는 퀴즈 ID 값입니다. 누구든지 하나의 문장을 사용하여 두 테이블에서 삭제하는 방법을 알고 있습니까? 가능한가?

DELETE tGeoQuestions as a, tGeoQuizToQuestion as b WHERE b.quizId = @quizId AND a.id = b.questionid 

답변

8

당신은 그렇지가 2 폭포는 당신이 PK 모든 FK 테이블과 테이블에서 삭제하기 만하면 모두가 자동으로

삭제됩니다, 자동적으로 일어날 다음 삭제를 활성화해야 단계 작업은

이 같은,

DELETE a 
FROM tGeoQuestions as a 
JOIN tGeoQuizToQuestion as b 
ON a.id = b.questionid 
AND b.quizId = @quizId 


DELETE tGeoQuizToQuestion WHERE quizId = @quizId 

3 번째 옵션은 모든 것을 삭제합니다 PK 테이블에 트리거 인 트란에 넣고 FK 테이블이 PK 테이블에서 삭제되면 ... 트리거를 권장하지 않습니다.

+3

아래와 같이 Tom이 경고합니다. 갑자기 데이터가 누락되었으므로 캐스케이드를주의해서 사용하십시오 –

+1

... 물론 거래에서 ... – gbn

+0

PK가 있고이를 삭제하면 FK도 삭제됩니다 데이터 PK 데이터가 더 이상 없다면 어떻게 빠져 있습니까? FK가 가리키는 곳은 어디입니까? – SQLMenace

0

단일 SQL 문에서는이 기능을 사용할 수 없습니다. 적절한 관계 설정이있는 경우 삭제가 자동으로 계단식 연결됩니다. 그렇지 않으면 2 개의 delete 문을 실행해야합니다.

0

당신은 MySQL의 delete에서이 작업을 수행 할 수 있습니다 수동 내가 당신이 중 하나가 외부 키를 사용하거나 질문에서 삭제할 필요가 있다고 생각 SQL 서버에서

DELETE [LOW_PRIORITY] [QUICK] [IGNORE] 
tbl_name[.*] [, tbl_name[.*] ...] 
FROM table_references 
[WHERE where_definition] 

등의 방법을 보여줍니다 여기서 퀴즈 = ... 다음에서 퀴즈 테이블

1

2 개에서 선택할 수있는 것과 같은 방법으로 같은 문장의 두 테이블에서 삭제할 수 있는지 확실하지 않습니다. 적어도 Oracle에서는 불가능합니다.

SQLMenace에 언급 된대로 최선의 방법은 계단식을 켜는 것입니다.

캐스케이드로주의를 기울여야합니다. 구조가 매우 복잡하면 많은 데이터를 손쉽게 지울 수 있습니다.

1

이 시도 : 그건 그렇고

DELETE a 
FROM tGeoQuestions as a 
INNER JOIN tGeoQuizToQuestion as b ON a.id = b.questionid 
WHERE b.quizId = @quizId 

를, 당신의 선택 문은 acctually (내가 ... 느릅 나무가 당신의 문 모르겠어요) 작동합니다.

SELECT ... 

DELETE [table name or alias] 

를 교체하고 다른 같은 모든 것을 떠나해야합니다.

관련 문제