我正在使用SQL Server并拥有一个表ProjectAccess
,我希望将其作为一种方法来锁定"访问项目。目前该表如下所示:
CREATE TABLE [dbo].[ProjectAccess]
(
[ProjectAccessID] INT IDENTITY (1, 1) NOT NULL,
[ProjectID] INT NOT NULL,
[UserSessionID] INT NOT NULL,
[Locked] BIT NOT NULL,
CONSTRAINT [uq_UserSessionID]
UNIQUE NONCLUSTERED ([UserSessionID]),
CONSTRAINT [fk_ProjectAccessToProject]
FOREIGN KEY ([ProjectID]) REFERENCES [dbo].[Project] ([ProjectID])
ON DELETE CASCADE,
CONSTRAINT [fk_ProjectAccessToUserSession]
FOREIGN KEY ([UserSessionID]) REFERENCES [dbo].[UserSession] ([UserSessionID])
ON DELETE CASCADE,
CONSTRAINT [PK_ProjectAccess]
PRIMARY KEY ([ProjectAccessID])
);
这个想法是只允许多个相同的项目ID进入此表,但只有一个可以将Locked
列值设为true。例如,只要两者都没有将Locked值设置为true,就可以同时在表中有两个ProjectID
1的记录。有没有办法做到这一点?我看到有一个检查约束,但似乎检查列中的所有值都满足某个条件,这与我希望的有点不同。提前感谢您,如果有任何事情不够清楚,请告诉我。
答案 0 :(得分:2)
您可以使用已过滤的唯一索引:
create unique index unq_projectaccess_projectid_locked
on projectaccess(projectid)
where locked = 1;