执行级联删除的嵌套 SQL Server 事务

Nested SQL Server transaction performing cascade delete

提问人:kjv 提问时间:9/12/2008 最后编辑:marc_skjv 更新时间:11/4/2010 访问量:3487

问:

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

SQL Server 事务 套级联

评论


答:

0赞 Vinko Vrsalovic 9/12/2008 #1

我不是在回答你的问题,但外来密钥要走的路,为什么它不是一个选择?

至于嵌套事务,它们是:

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

当然,从编程角度来看,它看起来是不同的,但这取决于你使用的平台

4赞 Brannon 9/12/2008 #2

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

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 将成功或失败,这在这种情况下并不那么重要,因为整个批处理要么成功,要么失败。

顺便说一句——我认为你的关系倒退了。该部门没有 EmployeeID,而员工将具有 DepartmentID。

评论

0赞 rpetrich 9/12/2008
可以优化查询以删除 Company 上的 INNER JOIN。或者这是 SQL Server 会自动执行的操作吗?
0赞 Brannon 9/13/2008
你是对的。我只是将它们添加为显式,但您可以将 WHERE 子句更改为:WHERE Department.CompanyID = @CompanyID