是否可以在多列和值上使用SQL约束?

时间:2017-12-08 01:28:37

标签: sql sql-server

我正在使用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的记录。有没有办法做到这一点?我看到有一个检查约束,但似乎检查列中的所有值都满足某个条件,这与我希望的有点不同。提前感谢您,如果有任何事情不够清楚,请告诉我。

1 个答案:

答案 0 :(得分:2)

您可以使用已过滤的唯一索引:

create unique index unq_projectaccess_projectid_locked
    on projectaccess(projectid)
    where locked = 1;
相关问题