我有以下两个表:
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
表中这个额外列的存在时,我们才需要视图和触发器。