【问题标题】:How to delete a row with data with its parent row in another table如何在另一个表中删除包含其父行的数据的行
【发布时间】:2016-05-26 10:59:08
【问题描述】:

有两个表 [UserData] 和 [HotelData] 我用外键链接了它们。这是“Username”,我想删除输入的用户名并删除第二个表中的数据。我不知道怎么写sql命令或c#。

“System.Data.SqlClient.SqlException”类型的未处理异常 发生在 System.Data.dll

附加信息:DELETE 语句与 REFERENCE 约束“FKHotelData”。数据库发生冲突 "E:\GRADED UNIT DEV\BLACKMARCH\BLACKMARCH\BIN\DEBUG\DATABASEBM.MDF", 表“dbo.HotelData”,列“用户名”。

语句已终止。

private void btnDelete_Click(object sender, EventArgs e)
{
    SqlConnection con = new SqlConnection(@"Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=E:\Graded unit Dev\BlackMarch\BlackMarch\bin\Debug\DataBaseBM.mdf;Integrated Security=True;Connect Timeout=30");
    string sqlStatement = "DELETE FROM UserData WHERE Username = @Username";
    con.Open();
    SqlCommand cmd = new SqlCommand(sqlStatement, con);
    cmd.Parameters.AddWithValue("@Username", txtUsernameUser.Text);
    cmd.CommandType = CommandType.Text;
    cmd.ExecuteNonQuery();
    con.Close();
}

【问题讨论】:

  • 先从 HotelData 中删除,然后从 UserDate 中删除。
  • 该消息非常具有解释性。由于您有 FK 约束,因此您无法从 UserData 中删除条目,除非您首先从 HotelData 中删除相关条目
  • 你能展示一下你的表结构和模型吗
  • 要么依次删除“子”行,然后是“父行”,或者启用级联删除
  • 嗨。如果您认为某个答案解决了问题,请通过单击答案旁边的灰色复选标记将其标记为“已接受”。检查此链接以了解接受答案的工作原理:meta.stackexchange.com/questions/5234/…

标签: c# sql sql-server


【解决方案1】:

当您从UserData 表中删除一条记录时,无需编写任何代码来删除子表上的数据。只需使用Cascade 删除行为。也就是说,如果父表中的一条记录被删除,那么子表中对应的记录也会被自动删除。

执行以下步骤:

  1. 打开子表的设计器并点击关系
  2. 在打开的窗口和表设计器中展开 INSERT And UPDATE Specification
  3. 将删除规则从 No action 更改为 Cascade

如下图:

【讨论】:

    【解决方案2】:

    DELETE 语句与 REFERENCE 约束“FKHotelData”冲突

    您有一个约束,这有助于提高性能,请帮自己一个忙,添加一个默认值为 0 的 IsDeleted 列或允许空值,这样它就不会影响任何事情。

    然后将您的 SELECT 查询更改为包含条件的 WHERE 子句

    WHERE IsDeleted = 0

    这里的重点是它是一家酒店业务,他们需要有关预订的指标/报告。出于医疗和保密目的,我倾向于使用级联删除答案。对于这种情况,最好逻辑上删除数据,而不是物理上删除它。

    【讨论】:

      【解决方案3】:

      嗯。扩展另一个不完全理想但也应该可用的选项。不过 CASCADE 更容易使用。

      没有这个,你最好的选择是

      DELETE FROM HotelData WHERE Username = @Username
      

      紧随其后

      DELETE FROM UserData WHERE Username = @Username
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-09-05
        • 2019-11-25
        • 1970-01-01
        • 2014-03-07
        相关资源
        最近更新 更多