删除父表和子表,而不使用级联删除(SQL Server 2012或.net 4)
本文关键字:删除 Server SQL 2012 net 级联 | 更新日期: 2023-09-27 18:24:52
使用SQL Server 2012数据库时,我需要实现一种功能,允许基于外键约束删除表中的一行及其所有引用的子项。
考虑到Cascade delete
是不可能的,因为我不能接触这个数据库,有没有人在C#中编写了一个存储过程或一些代码来删除父行及其所有子行,无论子行使用的深度如何他们的外国钥匙?
或者一个带有一些指针的链接/文章?
示例
表格:
- 客户
- 客户地址
- 客户地址
- 客户产品
- 产品已订购
如果我决定删除带有Id=1
的客户,它应该删除
CustomerTable
中的一行- 来自具有
customerId=1
的CustomerAddress
的所有行 - 属于
CustomerId=1
的所有customerProducts
- 属于具有关联
customerProductId
的Customer
的所有ProductOrdered
基本上,我们只知道根表Customer
和它的CustomerId
(通用实现)。
对任何不涉及第三方工具的建议持开放态度。
非常感谢您的任何建议
基本逻辑是先从层次结构的底部(嵌套最深的)移除,然后再移除引用。
如果您使用的是类似于这样的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