2009-10-19 162 views
1

我必須寫一個查詢來刪除表2表從2個表中刪除記錄

DELETE FROM [Policies],[BackupSpec] WHERE [PolicyID] = @original_PolicyID 

PloicyID是策略 中的PK和Backupspec中的FK

任何建議?

 SqlConnection conn = new SqlConnection(); 
     conn.ConnectionString = ConfigurationManager.ConnectionStrings["SumooHAgentDBConnectionString"].ConnectionString; 
     string sql = "DELETE FROM [Policies],[BackupSpec] WHERE [PolicyID] = @original_PolicyID"; 
     string sql1 = "DELETE FROM [Backupspec] WHERE [PolicyID] = @original_PolicyID"; 
     SqlCommand cmd = new SqlCommand(sql, conn); 
     SqlCommand cmd1 = new SqlCommand(sql1, conn); 

     cmd.Parameters.AddWithValue("@original_PolicyID", item); 


     conn.Open(); 
     cmd.ExecuteNonQuery(); 
     conn.Close(); 

回答

1

您不能一次從兩個表中刪除。這是SQl服務器的限制,因此您別無選擇,只能發送兩條刪除語句或在父記錄上定義級聯刪除。我推薦兩條語句而不是級聯刪除,因爲級聯刪除會導致鎖定問題,如果刪除涉及許多記錄。請記住,級聯刪除會影響涉及表中任何源的任何刪除操作,因此,即使您一次只刪除一條記錄,也會影響其他人在某個時間點需要刪除一百萬條記錄的情況。隨着子表的數量的增加,它也將花費更長和更長的時間並且捆綁更多的表。

0

在每次從一個表中刪除,並使用事務,使其原子。或者將FK定義爲ON DELETE CASCADE,並僅從父表中刪除。

+0

是不是有一個查詢來做到這一點.. ?? – user175084 2009-10-19 05:59:27

+0

不在SQL Server中(例如,有一種方法可以在MySQL中執行此操作)。 – 2009-10-19 06:08:40

0

更簡單的方法是從策略和備份規範表中刪除兩個單獨的查詢。我會這樣做的唯一原因是因爲

1)。其他人通過代碼調試來更容易理解發生了什麼。

2)。通常由經理類管理,它有助於分離代碼。

+0

即使我thougt相同,但它不會發生? – user175084 2009-10-19 06:11:37

+0

上述方法不起作用...任何幫助 – user175084 2009-10-19 06:16:45

+0

您需要確保先從backupspec中刪除,I.E總是在主鍵之前刪除外鍵 – RC1140 2009-10-19 17:15:14

0

如果您先執行從Backupspec的刪除,然後從Policies刪除,則您的代碼可以正常工作。

FK阻止您首先刪除Policies記錄(這是參照完整性的要點)。