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

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

System.Data.dll中发生了未处理的“System.Data.SqlClient.SqlException”类型exception

附加信息:DELETE语句与REFERENCE约束“FKHotelData”冲突。 冲突发生在数据库“E:\ GRADED UNIT DEV \ BLACKMARCH \ BLACKMARCH \ BIN \ DEBUG \ DATABASEBM.MDF”,表“dbo.HotelData”,列’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(); } 

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

执行以下步骤:

  1. 打开子表的设计器,然后单击“ 关系”
  2. 在打开的窗口和表设计器中展开INSERT和UPDATE规范
  3. 将删除规则从无操作更改为级联

如下图所示:

在此处输入图像描述

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

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

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

WHERE IsDeleted = 0

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

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

没有它,你最好的选择是

 DELETE FROM HotelData WHERE Username = @Username 

其次是

 DELETE FROM UserData WHERE Username = @Username