SQL Server - 从多个相关表中删除记录

时间:2018-04-10 15:14:57

标签: sql sql-server-2012

我有2个名为tblResponsetblUser的相关表格,我想从状态列中删除tblUser的值为inactive的记录。

tblResponse表格中,我还想删除已删除UserId tblUser的所有记录。

每个UserId可能在tblResponse表中有多个响应,它需要删除所有响应。

这项工作需要每天运行。

 DELETE A
 FROM tblUser A
 INNER JOIN tblUser U ON UserId = EmployeeID
 WHERE UserStatus = 'Inactive'

在上面的查询UserId来自tblUserEmployeeID来自tblResponse

如何从2个表中删除数据?

1 个答案:

答案 0 :(得分:2)

处理此问题的常用方法是使用外键约束设置表,其中ON DELETE设置为CASCADE

CREATE TABLE Users 
(
    ID INT NOT NULL PRIMARY KEY CLUSTERED IDENTITY(1, 1),
    ... other fields
)

CREATE TABLE Responses 
(
    ID INT NOT NULL PRIMARY KEY CLUSTERED IDENTITY(1, 1),
    UserID INT NOT NULL REFERENCES dbo.Users (ID) 
        ON UPDATE CASCADE  -- when UserID updated, update this UserID also
        ON DELETE CASCADE, -- when User deleted, delete these rows also
    ... other fields
)

这当然是首选方法,因为它指示数据库保持其自身的完整性,而不需要应用程序层来处理它。

有时候无法做到这一点,或者由于预先存在的数据不良的表(我们应该考虑清理数据然后应用约束),或者可能的循环约束,在这种情况下你必须使用两个删除语句:

-- remove the associated responses first
DELETE r
FROM Users AS u
INNER JOIN Responses AS r ON u.ID = r.UserID
WHERE u.Active = 0;

-- then delete your users
DELETE FROM Users WHERE Active = 0;