我有一个标识符表,IntervalFrom
并且IntervalTo
:
标识符 | 间隔自 | 间隔到 |
---|---|---|
1 | 0 | 2 |
1 | 2 | 4 |
2 | 0 | 2 |
2 | 2 | 4 |
我已经有了一个不允许间隔重叠的触发器。
我正在寻找不允许数据间隙的触发器或约束。我进行了搜索,发现的信息与查询和数据中的空白有关,而不是一开始就不允许。我找不到任何与此相关的触发器或约束。
这可能使用 T-SQL 吗?
提前致谢。
我有一个标识符表,IntervalFrom
并且IntervalTo
:
标识符 | 间隔自 | 间隔到 |
---|---|---|
1 | 0 | 2 |
1 | 2 | 4 |
2 | 0 | 2 |
2 | 2 | 4 |
我已经有了一个不允许间隔重叠的触发器。
我正在寻找不允许数据间隙的触发器或约束。我进行了搜索,发现的信息与查询和数据中的空白有关,而不是一开始就不允许。我找不到任何与此相关的触发器或约束。
这可能使用 T-SQL 吗?
提前致谢。
您可以构建一个自动不受重叠和间隙影响的表:
create table T (
ID int not null,
IntervalFrom int null,
IntervalTo int null,
constraint UQ_T_Previous_XRef UNIQUE (ID, IntervalTo),
constraint UQ_T_Next_XRef UNIQUE (ID, IntervalFrom),
constraint FK_T_Previous FOREIGN KEY (ID, IntervalFrom) references T (ID, IntervalTo),
constraint FK_T_Next FOREIGN KEY (ID, IntervalTo) references T (ID, IntervalFrom)
)
go
create unique index UQ_T_Start on T (ID) where IntervalFrom is null
go
create unique index UQ_T_End on T(ID) where IntervalTo is null
go
请注意,这确实需要对您的第一个和最后一个间隔稍有不同的约定 - 它们需要使用null
而不是0
或 (有点随意) 4
。
另请注意,修改此类表中的数据可能是一项挑战 - 如果您要插入新间隔,您还需要更新其他间隔以适应新间隔。MERGE
是你的朋友吗?
鉴于上述情况,我们可以插入您的(修改后的)样本数据:
insert into T (ID, IntervalFrom, IntervalTo) values
(1,null,2),
(1,2,null),
(2,null,2),
(2,2,null)
go
但是我们不能插入一个重叠的值(这个错误):
insert into T(ID, IntervalFrom, IntervalTo) values (1,1,3)
您还应该看到外键可以防止序列中存在间隙