【问题标题】:Nested SQL Server transaction performing cascade delete执行级联删除的嵌套 SQL Server 事务
【发布时间】:2008-09-12 13:12:59
【问题描述】:

假设我有一个名为 Companies 的表,它有一个 DepartmentID 列。还有一个包含 EmployeeID 列的部门表。当然,我也有一个 Employee 表。问题是我想删除一家公司,所以首先我必须删除每个部门的所有员工,然后是公司中的所有部门。 级联删除不是一个选项,因此我希望使用嵌套事务。我是 SQL 新手,非常感谢您的帮助。

【问题讨论】:

    标签: sql-server transactions nested cascade


    【解决方案1】:

    我不确定您为什么需要在这里嵌套事务。您只需要一笔实际交易:

    BEGIN TRAN
    
    DELETE FROM Employee
        FROM Employee
        INNER JOIN Department ON Employee.DepartmentID = Department.DepartmentID
        INNER JOIN Company ON Department.CompanyID = Company.CompanyID
        WHERE Company.CompanyID = @CompanyID
    
    DELETE FROM Department
        FROM Department
        INNER JOIN Company ON Department.CompanyID = Company.CompanyID
        WHERE Company.CompanyID = @CompanyID
    
    DELETE FROM Company
        WHERE Company.CompanyID = @CompanyID
    
    COMMIT TRAN
    

    注意双 FROM,这不是拼写错误,它是在 DELETE 中执行 JOIN 的正确 SQL 语法。

    每个语句都是原子的,整个 DELETE 要么成功要么失败,这在这种情况下并不重要,因为整个批处理要么成功要么失败。

    顺便说一句-我认为你的关系倒退了。 Department 没有 EmployeeID,Employee 会有 DepartmentID。

    【讨论】:

    • 可以优化您的查询以删除公司的内部联接。或者这会是 SQL Server 自动执行的操作吗?
    • 你是对的。我只是将它们添加为明确的,但您可以将 WHERE 子句更改为: WHERE Department.CompanyID = @CompanyID
    【解决方案2】:

    我没有回答你的问题,但是外键要走的路,为什么它不是一个选项?

    对于嵌套事务,它们是:

    BEGIN
      delete from Employee where departmentId = 1;
      BEGIN
         delete from Department where companyId = 2;
         BEGIN
            delete from Company where companyId = 2;
         END
      END
    END
    

    当然,以编程方式看起来会有所不同,但这取决于您使用的平台

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多