1回のクエリで、子テーブルと親テーブルからレコードを削除したいのですが。下記のクエリを見つけてください。ここでは応答ヘッダーが主テーブルで、responseidが主キーです。
DELETE FROM responseheader
FROM responseheader
INNER JOIN responsepromotion ON responseheader.responseid = responsepromotion.ResponseID
INNER JOIN responseext ON responsepromotion.ResponseID=responseext.ResponseID
WHERE responseheader.responseid In ("67D8B9E8-BAD2-42E6-BAEA-000025D56253")
しかし、そのスローエラー。誰かが私に正しい質問を見つけるのを手伝ってくれる?
回答:
回答№1の場合は3ある種のカスケード削除を使用しない限り、単一のdeleteステートメントは単一のテーブルから行を削除します。
あなたの例では、構文が正しければ、あなたはそこから行を削除するでしょう。 responseheader
残りの表は、どの行から削除するのかを決定するためだけに使用されます。 responseheader
.
鈍くするには 本当に カスケード削除を使用したくないので、各テーブルに1つずつ、複数のdeleteステートメントを実行する必要があります。
回答№2の場合は0
ストアドプロシージャを作成し、そのストアドプロシージャを呼び出して削除することもできます。次のように、sp_executesqlを使用してバッチクエリを一度に送信することもできます。
sp_executesql
"DELETE FROM responsepromotion
FROM responsepromotion
INNER JOIN responseheader ON responseheader.responseid = responsepromotion.ResponseID
WHERE responseheader.responseid = @guid;
DELETE FROM responseext
FROM responseext
INNER JOIN responseheader ON responsepromotion.ResponseID=responseext.ResponseID
WHERE responseheader.responseid = @guid;
DELETE FROM responseheader
WHERE responseid = @guid;",
@guid = "67D8B9E8-BAD2-42E6-BAEA-000025D56253"
回答№3の場合は0
ラッセカスケード削除で述べたように、唯一のものです単一の照会で複数の表から削除するオプション。そのためには、外部キーを設定してマスターテーブルのエントリを削除する必要があります。そこに子テーブルの行が削除されます。しかし、それは使用されていません。複数のdeleteステートメントを使用することをお勧めします。自動コミットをfalseに設定してトランザクションを使用することもできます。その後、行を削除し、必要に応じて手動でコミットまたはロールバックします。