2

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

@quizIdは、ストアド プロシージャに渡すクイズ Id 値です。1 つのステートメントを使用して両方のテーブルから削除する方法を知っている人はいますか? 出来ますか?

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

5 に答える 5

9

カスケード削除を有効にする必要があります。その後、自動的に行われます。PK を使用してテーブルから削除するだけで、すべての fk テーブルが自動的に削除されます。

それ以外の場合は、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 

3番目のオプションは、PKテーブルで削除された場合にFKテーブルからすべてを削除するPKテーブルのトリガーです...トリガーはお勧めしません

于 2009-07-07T20:00:46.353 に答える
2

これを試して:

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

ちなみに、あなたの select ステートメントは実際に機能します (そして、あなたのステートメントがどれなのかわかりません...)。

のみを交換する必要があります

SELECT ...

DELETE [table name or alias]

他のすべてを同じままにします。

于 2009-07-07T20:14:52.940 に答える
1

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

SQLMenace が述べたように、最善の策はカスケードを有効にすることです。

ただし、カスケードには注意してください。構造に深く根付いていると、大量のデータを簡単に消去してしまいます。

于 2009-07-07T20:03:47.563 に答える
0

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

于 2009-07-07T20:03:14.723 に答える
0

mysql deleteでこれを行うことができます。マニュアルには、メソッドが次のように表示されます

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

SQLサーバーでは、外部キーを使用するか、クイズ= ...の質問から削除してからクイズテーブルから削除する必要があると思います

于 2009-07-07T20:03:16.160 に答える