SQL Server如何一次性删除带外键关联的指定员工全部相关数据
解决方案
方法1:按外键依赖顺序在事务中批量删除(推荐练习场景使用)
Northwind库中三张表的依赖关系为底层子表[Order Details]关联中间表Orders,中间表Orders关联顶层父表Employees,按从子到父的顺序删除即可避免外键冲突,用事务包裹可以保证删除操作的原子性,要么全部执行成功,要么出错全部回滚,不会产生部分删除的脏数据。
BEGIN TRANSACTION; -- 第一步:删除EmployeeID=7关联的所有订单明细 DELETE FROM [Order Details] WHERE OrderID IN ( SELECT OrderID FROM Orders WHERE EmployeeID = 7 ); -- 第二步:删除EmployeeID=7关联的所有订单 DELETE FROM Orders WHERE EmployeeID = 7; -- 第三步:删除EmployeeID=7的员工记录 DELETE FROM Employees WHERE EmployeeID = 7; -- 执行无异常则提交,出错可执行ROLLBACK TRANSACTION回滚所有操作 COMMIT TRANSACTION;
方法2:设置外键级联删除(适合频繁需要关联删除的场景)
如果需要经常做这类关联删除操作,可以修改外键约束开启级联删除,后续删除员工时数据库会自动清理所有关联的子表数据,不需要手动写多段删除逻辑。
-- 先删除Orders表原有外键约束,新增带级联删除的外键 ALTER TABLE Orders DROP CONSTRAINT FK_Orders_Employees; ALTER TABLE Orders ADD CONSTRAINT FK_Orders_Employees_Cascade FOREIGN KEY (EmployeeID) REFERENCES Employees(EmployeeID) ON DELETE CASCADE; -- 再修改[Order Details]表原有外键约束,新增带级联删除的外键 ALTER TABLE [Order Details] DROP CONSTRAINT FK_Order_Details_Orders; ALTER TABLE [Order Details] ADD CONSTRAINT FK_Order_Details_Orders_Cascade FOREIGN KEY (OrderID) REFERENCES Orders(OrderID) ON DELETE CASCADE;
配置完成后直接执行原本的删除语句即可一次性清理所有关联数据:
DELETE FROM Employees WHERE EmployeeID = 7;
注意:级联删除权限较高,生产环境使用前务必做好数据备份,避免误操作导致大批量数据丢失。
内容的提问来源于stack exchange,提问作者Levi Lenaers
相关产品推荐
相关产品推荐

