繁体   English   中英

从2个表中删除记录

[英]delete records from 2 tables

我必须编写查询以删除表格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();

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

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

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

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

2)。通常由经理类管理,这有助于分离代码。

如果您执行从删除您的代码chould工作Backupspec第一,然后删除Policies

FK阻止您首先删除“ Policies记录(这是“引用完整性”的要点)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM