从2个表中删除记录

时间:2009-10-19 05:54:03

标签: c# sql sql-server-2005

我必须编写一个查询来删除表格2表

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

PloicyID是策略中的PK Backupspec中的FK和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();

4 个答案:

答案 0 :(得分:1)

您无法一次从两个表中删除。这是SQl Server的限制,因此您别无选择,只能发送两个删除语句或在父记录上定义级联删除。我建议使用两个语句而不是级联删除,因为如果删除涉及许多记录,则级联删除会导致锁定问题。请记住,级联删除会影响所涉及的表中任何来源的任何删除,因此即使您一次只删除一条记录,如果将来某个人需要删除一百万条记录,也会产生影响。随着子表数量的增加,它也会花费更长时间并占用更多表。

答案 1 :(得分:0)

一次从一个表中删除并使用事务使其成为原子。或者将FK定义为ON DELETE CASCADE并仅从父表中删除。

答案 2 :(得分:0)

更简洁的方法是从策略和备份规范表中删除2个单独的查询。我这样做的唯一原因是因为

1)。通过代码调试的其他人更容易理解发生的事情。

2)。通常由一个帮助分离代码的经理类管理。

答案 3 :(得分:0)

如果您先从Backupspec执行删除,然后从Policies删除,您的代码就可以使用。

FK阻止您首先删除Policies记录(这是参照完整性的点)。