如何在另一个表中删除包含其父行的数据的行

时间:2016-05-26 10:59:09

标签: c# sql sql-server

有两个表[UserData]和[HotelData]我已将它们与外键相关联。这是" Username"我想删除哪个用户名输入并删除其在第二个表上的数据。我不知道如何编写sql命令或c#。

  

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

中      

其他信息:DELETE语句与   参考约束" FKHotelData"。冲突发生在数据库中   " E:\ GRADED UNIT DEV \ BLACKMARCH \ BLACKMARCH \ BIN \ DEBUG \ DATABASEBM.MDF",   table" dbo.HotelData",column' Username'。

声明已经终止。

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();
}

3 个答案:

答案 0 :(得分:2)

UserData表中删除记录时,无需编写任何代码来删除子表上的数据。只需使用Cascade删除行为即可。这意味着如果删除父表中的记录,则会自动删除子表中的相应记录。

执行以下步骤:

  1. 打开子表的设计器,然后单击 Relationships
  2. 在打开的窗口和表设计器中展开INSERT和UPDATE规范
  3. 将删除规则从无操作更改为级联
  4. 如下图所示:

    enter image description here

答案 1 :(得分:1)

  

DELETE语句与REFERENCE约束冲突" FKHotelData"

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

然后将SELECT查询更改为包含条件

的WHERE子句

WHERE IsDeleted = 0

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

答案 2 :(得分:0)

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

没有它,你最好的选择是

DELETE FROM HotelData WHERE Username = @Username

其次是

DELETE FROM UserData WHERE Username = @Username