SQL Server 检查约束以防止特定重复

Nor*_*son 2 sql-server indexing constraints

我有这样的数据结构:

CREATE TABLE test_Bundles 
(
   BundleId INT,
   UserId INT,
   status INT
)

INSERT INTO test_Bundles VALUES (1, 1, 1)
INSERT INTO test_Bundles VALUES (2, 1, 3)
INSERT INTO test_Bundles VALUES (3, 1, 3)
INSERT INTO test_Bundles VALUES (4, 2, 1)
INSERT INTO test_Bundles VALUES (5, 2, 3)
INSERT INTO test_Bundles VALUES (6, 2, 3)
GO
Run Code Online (Sandbox Code Playgroud)

一名用户只能拥有一个状态 = 1 的捆绑包。但他们可以拥有状态 = 2 或状态 = 3 或状态 = 4 的批次。

谁能想出一种方法在 SQL Server 中强制执行此规则吗?

boy*_*dc7 5

那么,您自然可以使用触发器,或者可以使用唯一的过滤索引(如果您运行的是 SQL Server 2008 或更高版本),即类似:

create unique index ix_tmp 
on test_Bundles (UserId, status) where status = 1;
Run Code Online (Sandbox Code Playgroud)

如果您更喜欢采用触发器路由(这适用于任何合理的 SQL Server 版本),它看起来像这样:

create trigger tgrTmp on test_Bundles for insert, update 
as
begin;

if exists(  select  * 
            from test_Bundles t
            join inserted i 
            on t.UserId = i.UserId
            and t.BundleId != i.BundleId
            where t.status = 1 
            and i.status = 1)
begin;
    raiserror ('unique violation',16,1);
    rollback;
end;

end;
Run Code Online (Sandbox Code Playgroud)