SQL Server条件唯一索引

Pau*_*ing 7 sql t-sql sql-server unique-constraint azure-sql-database

给出下表(和示例数据):

PK | ClientID | SetID | Title
-----------------------------
P1 | C1       | S1    | Title1
P2 | C1       | S1    | Title1
P3 | C2       | S2    | Title1
P4 | C2       | S2    | Title1
P3 | C1       | S3    | Title2
P5 | C1       | S3    | Title2
Run Code Online (Sandbox Code Playgroud)

假设a Set属于a Client,我是否可以使用一个唯一的索引来限制标题在客户端中是唯一的,除非它在同一个集合中有兄弟姐妹.

例如,我可以有Title1两个Clients而不是两个一个Client.现在Client1,我希望有第二个记录,Title1但只有当它与SetID其他所有记录相同时Title.

需要注意的是,我正在使用SQL Azure,但我也更感兴趣(例如2008 R2/2012).

编辑:
请注意我无法更改表格的结构.它已经以这种方式存在,并且背后有一个复杂的业务层.如果我可以解决这个问题,那么很好,如果没有,那么我可以让它破碎.

i-o*_*one 2

您可以尝试其他索引视图。

例如一个表:

create table dbo.Test (PK int, ClientID int, SetID int, Title varchar(50), primary key (PK))

insert into dbo.Test values
    (1, 1, 1, 'Title1')
    ,(2, 1, 1, 'Title1')
    ,(3, 2, 2, 'Title1')
    ,(4, 2, 2, 'Title1')
    ,(5, 1, 3, 'Title2')
    ,(6, 1, 3, 'Title2')
Run Code Online (Sandbox Code Playgroud)

视图和索引:

create view dbo.vTest
with schemabinding
as
    select ClientID, Title, SetID, cnt=count_big(*)
    from dbo.Test
    group by ClientID, Title, SetID
GO
create unique clustered index UX_vTest on dbo.vTest (ClientID, Title)
GO
Run Code Online (Sandbox Code Playgroud)

然后:

insert into dbo.Test values (7, 1, 1, 'Title1') -- will pass
insert into dbo.Test values (8, 1, 1, 'Title1') -- will pass
insert into dbo.Test values (9, 1, 2, 'Title1') -- will fail
insert into dbo.Test values (10, 2, 2, 'Title1') -- will pass
insert into dbo.Test values (11, 1, 3, 'Title1') -- will fail
Run Code Online (Sandbox Code Playgroud)