-2

我有一个标识符表,IntervalFrom并且IntervalTo

标识符 间隔自 间隔到
1 0 2
1 2 4
2 0 2
2 2 4

我已经有了一个不允许间隔重叠的触发器。

我正在寻找不允许数据间隙的触发器或约束。我进行了搜索,发现的信息与查询和数据中的空白有关,而不是一开始就不允许。我找不到任何与此相关的触发器或约束。

这可能使用 T-SQL 吗?

提前致谢。

4

1 回答 1

0

您可以构建一个自动不受重叠和间隙影响的表:

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)

您还应该看到外键可以防止序列中存在间隙

于 2021-12-09T07:31:42.400 回答