SQL Server中的CHECK约束不允许超出外键的值



我有以下两个表:

CREATE TABLE test1
(
    ID int IDENTITY UNIQUE,
    length int not null
)
CREATE TABLE test2
(
    ID int IDENTITY UNIQUE,
    test1number int references test1(ID),
    distance int not null
)

示例:让insert into test1值1和100 (ID=1, length=100)。现在让我们在test2中插入值1作为ID, test1number=1作为来自test1的引用。我想创建一个约束,不允许写距离大于100(从test1的长度)。

除了程序还有其他方法吗?

如果这是单独的行,我们不需要断言一些属性关于所有行具有相同的test1number值,那么一种方法是这样做:

CREATE TABLE test1
(
    ID int IDENTITY UNIQUE,
    length int not null,
    constraint UQ_test1_Length_XRef UNIQUE (ID,Length)
)
go
CREATE TABLE _test2
(
    ID int IDENTITY UNIQUE,
    test1number int references test1(ID),
    _test1length int not null,
    distance int not null,
    constraint FK_test2_test1_length_xref foreign key (test1number,_test1length) 
            references test1 (ID,length) on update cascade,
    constraint CK_length_distance CHECK (distance <= _test1length)
)
go
create view test2
as
    select ID,test1number,distance from _test2
go
create trigger T_I_t2 on test2
instead of insert
as
    insert into _test2(test1number,_test1length,distance)
    select test1number,length,distance
    from inserted i inner join test1 t on i.test1number = t.id
go

只有当您试图对用户隐藏_test2表中这个额外列的存在时,我们才需要视图和触发器。

最新更新