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. 所以,我想指数或某种触发,将允许有多个的Ranges与IsActive = 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)
是否可以?
您可以像这样创建一个唯一的过滤索引:
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)
| 归档时间: |
|
| 查看次数: |
4436 次 |
| 最近记录: |