删除父表和子表,而不使用级联删除(SQL Server 2012或.net 4)

本文关键字:删除 Server SQL 2012 net 级联 | 更新日期: 2023-09-27 18:24:52

使用SQL Server 2012数据库时,我需要实现一种功能,允许基于外键约束删除表中的一行及其所有引用的子项。

考虑到Cascade delete是不可能的,因为我不能接触这个数据库,有没有人在C#中编写了一个存储过程或一些代码来删除父行及其所有子行,无论子行使用的深度如何他们的外国钥匙?

或者一个带有一些指针的链接/文章?

示例

表格:

  1. 客户
  2. 客户地址
  3. 客户地址
  4. 客户产品
  5. 产品已订购

如果我决定删除带有Id=1的客户,它应该删除

  • CustomerTable中的一行
  • 来自具有customerId=1CustomerAddress的所有行
  • 属于CustomerId=1的所有customerProducts
  • 属于具有关联customerProductIdCustomer的所有ProductOrdered

基本上,我们只知道根表Customer和它的CustomerId(通用实现)。

对任何不涉及第三方工具的建议持开放态度。

非常感谢您的任何建议

删除父表和子表,而不使用级联删除(SQL Server 2012或.net 4)

基本逻辑是先从层次结构的底部(嵌套最深的)移除,然后再移除引用。

如果您使用的是类似于这样的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