我有一个带有以下列的表:
用户ID,登录时间,注销时间
当用户登录该用户是否已经有一个登录时间的行,但没有注销时间时,他会重新使用该行时,否则会创建一个新的。问题有时是存储过程运行两次,我有两个条目。
在这种情况下,我可以使用约束来防止它成为可能吗?
尝试以下
CREATE TABLE UserLog(
ID int NOT NULL IDENTITY PRIMARY KEY,
UserID int NOT NULL,
LoginTime datetime NOT NULL DEFAULT SYSDATETIME(),
LogountTime datetime
)
-- unique index with where clause
CREATE UNIQUE INDEX UK_UserLog_UserID ON UserLog(UserID) WHERE LogountTime IS NULL
GO
INSERT UserLog(UserID)
VALUES(1)
-- Cannot insert duplicate key row in object 'dbo.UserLog' with unique index 'UK_UserLog_UserID'. The duplicate key value is (1).
INSERT UserLog(UserID)
VALUES(1)
UPDATE UserLog
SET
LogountTime=SYSDATETIME()
WHERE UserID=1
AND LogountTime IS NULL
INSERT UserLog(UserID)
VALUES(1)
SELECT *
FROM UserLog