我有2个名为tblResponse
和tblUser
的相关表格,我想从状态列中删除tblUser
的值为inactive
的记录。
在tblResponse
表格中,我还想删除已删除UserId
tblUser
的所有记录。
每个UserId
可能在tblResponse
表中有多个响应,它需要删除所有响应。
这项工作需要每天运行。
DELETE A
FROM tblUser A
INNER JOIN tblUser U ON UserId = EmployeeID
WHERE UserStatus = 'Inactive'
在上面的查询UserId
来自tblUser
而EmployeeID
来自tblResponse
。
如何从2个表中删除数据?
答案 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;