2016-11-15 16 views
0

メインテーブルのIDを8つのテーブルの外部キーとして参照していることを理解したスクリプトを実行中に、メインテーブルからレコードを削除しようとしています。テーブル制約を変更する必要があるので、私はCASCADE DELETEを使いたくありません。私のメインテーブルはJobと呼ばれ、プライマリキーは 'Id'で、他のテーブルでは外部キー 'JobId'として参照されます。外部キーを持つ複数のテーブルから削除する

メインテーブルから削除する前に、関連テーブルの外部キー参照レコードを削除するにはどうすればよいですか。

ここは私のコードです。コメントされたコードは単なる予測にすぎません。

SELECT * FROM [JOB] j WHERE [email protected] AND [email protected] AND [email protected] 
        AND Id<>@Id AND NOT EXISTS (SELECT * FROM NewJob nj WHERE J.Id=nj.Id)       
       --DELETE FROM [Table1] a WHERE a.JobId = j.Id AND 
       --DELETE FROM [Table2] F WHERE f.JobId = j.Id AND 
       --DELETE FROM [Table3] jct WHERE jct.JobId = j.Id AND 
       --DELETE FROM [Table4] jch WHERE jch.JobId = j.Id AND 
       --DELETE FROM [Table5] jedu WHERE jedu.JobId = j.Id AND 
       --DELETE FROM [Table6] jexp WHERE jexp.JobId = j.Id AND 
       --DELETE FROM [Table7] jflc WHERE jflc.JobId = j.Id AND 
       --DELETE FROM [Table8] usj WHERE usj.JobId = j.Id AND 
DELETE FROM [JOB] WHERE Id IN (SELECT Id FROM [JOB] WHERE [email protected] AND [email protected] AND [email protected] AND Id<>@Id) 
+0

私はその後、PK/FK関係テーブル上の一時テーブルに内部結合を持つ他のテーブルの上に削除を使用、一時テーブルにあなたのメインテーブルからデータを入れて試してみました。 –

+0

正しいソリューションのような 'DELETE CASCADE'サウンドは、あなたがなぜそれを使いたくないのかわかりません。もう1つの方法は、最初にすべての外部表を削除するトランザクション内の関数を作成することです。 –

+0

例を示すことができます – user1221765

答えて

1

まず、あなたはすべての関係のために外を見る必要があり、その後、あなたは自分のメインクエリから(ID)をキーに基づいて参照されるテーブルに対してDELETEステートメントを実行することができます。基本的な考え方は次のとおりです。

-- how many tables and references? Just to be sure. 
EXEC sp_fkeys 'Job' 

-- required query for deleting relationships 
DELETE FROM ForeignTable WHERE JobId IN (SELECT Id FROM Job WHERE [....]) 
DELETE FROM ForeignTable2 WHERE JobId IN (SELECT Id FROM Job WHERE [....]) 

-- main query 
DELETE FROM [JOB] WHERE Id IN (SELECT Id FROM [JOB] WHERE [email protected] AND [email protected] AND [email protected] AND Id<>@Id) 

希望します。

+0

ありがとう、これは助けました – user1221765

1

メインテーブルから削除するIDを保存する一時テーブルを作成すると、このようなことが起きる可能性があります。 ACIDのプロパティを維持するために、トランザクション内ですべて実行してください。

Begin Transaction 
Create Table #JobIDsToDelete (JobID int); 
Insert Into #JobIDsToDelete 
Select ID 
    From [Job] As j 
    Left Join NewJob As nj On j.ID = nj.ID 
    Where Name = @Name 
    And Title = @Title 
    And Zip = @Zip 
    And ID <> @ID 
    And nj.ID Is Null; 

Delete From Table1 Where JobID In (Select JobID From #JobIDsToDelete); 
Delete From Table2 Where JobID In (Select JobID From #JobIDsToDelete); 
... 
Delete From [Job] Where ID In (Select JobID From #JobIDsToDelete); 
Commit Transaction 
+0

あなたはおそらく 'TRY ... CATCH'とエラー処理などを追加したいと思いますが、これは別の話題です。 – mendosi

関連する問題