带条件的 SQL Server 索引

nuc*_*eet 1 sql-server indexing database-trigger

我有Range带列的表

Start (date), RangeTypeId (integer), ChannelId (integer), IsActive (bit)
Run Code Online (Sandbox Code Playgroud)

我有这个索引:

CREATE UNIQUE NONCLUSTERED INDEX [IX_Range_Unique] 
ON [dbo].[Range] ([Start] ASC, [RangeTypeId] ASC, [ChannelId] ASC, [IsActive] ASC)
Run Code Online (Sandbox Code Playgroud)

我希望我的索引仅在 2 行带有IsActive = 1. 所以,我想指数或某种触发,将允许有多个的RangesIsActive = 0和相同的开始日期,频道标识和类型,但只有一个IsActive = 1和相同的开始日期,频道标识和类型。

有效的数据库表状态示例:

Start | RangeTypeId | ChannelId | IsActive
------------------------------------------
23:00        5           1          0  
23:00        5           1          0  
23:00        5           1          0  
23:00        5           1          1  
Run Code Online (Sandbox Code Playgroud)

无效的:

Start | RangeTypeId | ChannelId | IsActive
------------------------------------------
23:00        5           1          0  
23:00        5           1          0  
23:00        5           1          1  
23:00        5           1          1  
Run Code Online (Sandbox Code Playgroud)

是否可以?

Sql*_*Zim 6

您可以像这样创建一个唯一的过滤索引

CREATE UNIQUE NONCLUSTERED INDEX [uIXf_Range_Unique] ON [dbo].[Range]
(
    [Start] ASC,
    [RangeTypeId] ASC,
    [ChannelId] ASC,
    [IsActive] ASC
)
where IsActive = 1
Run Code Online (Sandbox Code Playgroud)

reextester 演示:http ://rextester.com/LBI81243


create table range ([Start] varchar(5), [RangeTypeId] int, [ChannelId] int, [IsActive] int) ; 
insert into range ([Start], [RangeTypeId], [ChannelId], [IsActive]) values
('23:00', 5, 1, 0),
('23:00', 5, 1, 0),
('23:00', 5, 1, 0),
('23:00', 5, 1, 1)
;
CREATE UNIQUE NONCLUSTERED INDEX [uIXf_Range_Unique] ON [dbo].[Range]
(
    [Start] ASC,
    [RangeTypeId] ASC,
    [ChannelId] ASC,
    [IsActive] ASC
)
where IsActive = 1
go
/* throws an error error due to duplicate key */
insert into range ([Start], [RangeTypeId], [ChannelId], [IsActive]) values
('23:00', 5, 1, 1)
Run Code Online (Sandbox Code Playgroud)