2009-10-19 118 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记录(这是参照完整性的要点)。