2016-11-15 206 views
0

我想從主表中刪除記錄,同時運行我理解的腳本時,我的主表中的Id被引用爲8個其他表中的外鍵。我不想使用CASCADE DELETE,因爲我必須改變表約束。我的主表稱爲Job,其主鍵爲'Id',在其他表中被引用爲外鍵'JobId'。從多個表中刪除外鍵

在從主Job表中刪除之前,如何刪除相關表中的外鍵引用記錄。

這是我的下面的代碼。評論的代碼只是一個預測。

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'聽起來像正確的解決方案不知道你爲什麼不想使用它。另一種方法是在事務中創建一個函數來首先刪除所有的外表。 –

+0

你能舉一個例子請 – user1221765

回答

1

首先,你應該去尋找所有的關係,然後你可以只對運行從主查詢基於鍵(IDS)引用的表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

如果您創建一個臨時表來存儲要從主表發現它們後刪除的標識,那麼類似這樣的東西可能會最容易。在交易中也要這樣做,以保持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