使用SQL Server 2012数据库,我需要实现一个功能,允许删除表中的行以及基于外键约束引用的所有子行。
鉴于Cascade delete
是不可能的,因为我无法触及此数据库,是否有人在C#中编写了存储过程或某些代码,删除了父行及其所有孩子,无论这些孩子是多么深去用
他们的外键?
或者带有一些指针的链接/文章?
示例
表:
如果我决定删除Id=1
的客户,则应删除
CustomerTable
CustomerAddress
的所有行customerId=1
customerProducts
CustomerId=1
ProductOrdered
Customer
的所有customerProductId
基本上我们只知道根表Customer
及其CustomerId
(通用实现)。
对任何不涉及第三方工具的建议开放。
非常感谢任何建议
答案 0 :(得分:2)
基本逻辑是首先从层次结构的底部(最深的嵌套)中删除,并在此过程中删除引用。
如果你正在使用这样的ORM。
foreach(var c in Customer)
{
var caToClear = c.CustomerAddress().ToList();
c.CustomerAddress.RemoveAll();
foreach(var ca in c.caToClear)
{
ca.Delete();
}
var cpToClear = c.CustomerProducts.ToList();
c.CustomerProducts.RemoveAll();
foreach(var cp in cpToClear)
{
var poToClear = cp.ProductOrdered.ToList();
cp.ProductOrdered.RemoveAll();
foreach(var po in poToClear)
{
po.Delete();
}
cp.Delete();
}
c.Delete();
}
在SQL中执行相同的操作
DELETE FROM productordered
WHERE id IN (SELECT product_ordered_id
FROM customerproducts
WHERE customer_id = id_to_delete)
DELETE FROM customeraddress
WHERE id IN (SELECT customer_address_id
FROM customer
WHERE customer_id = id_to_delete)
DELETE FROM customer
WHERE id = id_to_delete