删除父子记录而不使用删除级联
Delete parent and child records without using on delete cascade
那么,让我们进入正题。我有一个项目,用户可以在其中从数据库中删除记录,但是如果我删除父记录,我当然会得到一个错误,因为它在另一个 table 中有子记录。所以,我想做的是删除父记录,当我删除它时,子记录中所有包含父键或主键的行也将被删除,而不使用级联。
这里是示例代码:
if (row != -1)
{
tbl_employee.Rows.RemoveAt(row);
int id = Convert.ToInt32(txt_employeeid.Text.ToString());
employee emp = db.employees.Single(x => x.employeeid == id);
db.employees.DeleteOnSubmit(emp);
db.SubmitChanges();
}
else
{
MessageBox.Show("Click the row first!");
}
但是,我有一个错误The DELETE statement conflicted with the REFERENCE constraint
。我知道我可以使用 on delete cascade
,但是有没有其他方法可以在不使用它的情况下删除子记录?
使用 Cascade Delete
是最简单的,但我同意这不是一个好的解决方案,因为您无法控制哪些子 table 可以被删除,哪些不可以。
所以你还有 2 个选项:
- 在删除主数据之前,先删除客户端中子 table 的行(当然是在同一个事务中)
- 删除
instead of trigger
子 table 行(和主 table 行)中的行
后者的优点是再次在数据库端完成,并且与其他解决方案一样,您还可以控制哪些 table 可以删除,哪些不可以删除。
如果你愿意,你甚至可以在那里放一些额外的支票。
那么,让我们进入正题。我有一个项目,用户可以在其中从数据库中删除记录,但是如果我删除父记录,我当然会得到一个错误,因为它在另一个 table 中有子记录。所以,我想做的是删除父记录,当我删除它时,子记录中所有包含父键或主键的行也将被删除,而不使用级联。
这里是示例代码:
if (row != -1)
{
tbl_employee.Rows.RemoveAt(row);
int id = Convert.ToInt32(txt_employeeid.Text.ToString());
employee emp = db.employees.Single(x => x.employeeid == id);
db.employees.DeleteOnSubmit(emp);
db.SubmitChanges();
}
else
{
MessageBox.Show("Click the row first!");
}
但是,我有一个错误The DELETE statement conflicted with the REFERENCE constraint
。我知道我可以使用 on delete cascade
,但是有没有其他方法可以在不使用它的情况下删除子记录?
使用 Cascade Delete
是最简单的,但我同意这不是一个好的解决方案,因为您无法控制哪些子 table 可以被删除,哪些不可以。
所以你还有 2 个选项:
- 在删除主数据之前,先删除客户端中子 table 的行(当然是在同一个事务中)
- 删除
instead of trigger
子 table 行(和主 table 行)中的行
后者的优点是再次在数据库端完成,并且与其他解决方案一样,您还可以控制哪些 table 可以删除,哪些不可以删除。
如果你愿意,你甚至可以在那里放一些额外的支票。