2009-07-07 11 views
2

質問テーブルと関係テーブルから、クイズIDに一致するすべてのレコードを削除しようとしています。クエリはselectステートメントに対して機能しますが、同じステートメントでは削除できません。関連テーブルのSQL削除

@quizIdは私のストアドプロシージャに渡すクイズID値です。誰もが1つのステートメントを使用して両方のテーブルから削除する方法を知っていますか?出来ますか?あなたはそれがすべてを行う必要がPKでテーブルから削除され、すべてのFKテーブルが自動的に

削除され、自動的に起こるカスケード削除を有効にする必要があり

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

答えて

8

そうでない場合は2でありますステップ動作

このような何か、

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


DELETE tGeoQuizToQuestion WHERE quizId = @quizId 

TRANでこれを入れて、あなたの第三の選択肢はからすべてを削除PKテーブル上のトリガでありますFKテーブルがPKテーブルで削除された場合...トリガーを推奨しません。

+3

次のようにTomが警告しているように、カスケードは慎重に使用してください。突然、データが見つからないため –

+1

...トランザクションで... – gbn

+0

PKをお持ちの場合は削除し、FKも削除しますどのようにPKデータがそこにない場合は、データが欠落しています..どこにFKが指していますか? – SQLMenace

0

これは単一のSQLステートメントでは不可能とは限りません。適切な関係設定がある場合、削除は自動的にカスケードされます。それ以外の場合は、2つの削除ステートメントを発行する必要があります。

0

はMySQL deleteでこれを行うことができますが、マニュアルは、私はあなたがどちらかが外部キーを使用するか、質問から削除する必要があると思うSQLサーバで

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

などの方法を示し、ここでクイズ= ...そしてからクイズテーブル

1

同じステートメント内の2つのテーブルから2つから選択するのと同じ方法で削除することはできません。少なくともOracleでは不可能です。

SQLMenaceに言及したように、カスケードをオンにするのが最良の方法です。

カスケードに注意してください。構造に非常に陥っていると、たくさんのデータを消去するのが非常に簡単になります。 (...と私はウィッヒを知らないあなたの文です)、あなたのselect文acctually動作しますが、ちなみに

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

1

はこれを試してみてください。

あなたは

DELETE [table name or alias] 

でのみ

SELECT ... 

を交換し、同じ他のすべてを残しておく必要があります。

関連する問題