Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/105.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 基于SQL Server中引用表的值创建约束_Sql Server - Fatal编程技术网

Sql server 基于SQL Server中引用表的值创建约束

Sql server 基于SQL Server中引用表的值创建约束,sql-server,Sql Server,我有两张桌子: 铅笔: 颜色: 我想在Pencil表中创建约束,这样用户就不能输入可用性为否的颜色的颜色ID值。最好的方法是什么?谢谢。您可以向包含可用性信息的颜色表中添加,然后使用带有计算列的外键以确保其受约束: create table Colors ( ID int not null, Name varchar(30) not null, Available bit not null, constraint PK_Colors PRIMARY KEY (ID

我有两张桌子:

铅笔:

颜色:

我想在Pencil表中创建约束,这样用户就不能输入可用性为否的颜色的颜色ID值。最好的方法是什么?谢谢。

您可以向包含可用性信息的颜色表中添加,然后使用带有计算列的外键以确保其受约束:

create table Colors (
    ID int not null,
    Name varchar(30) not null,
    Available bit not null,
    constraint PK_Colors PRIMARY KEY (ID),
    constraint UQ_Color_Names UNIQUE (Name),
    constraint UQ_Color_AvailabilityXRef UNIQUE (ID,Available)
)
go
create table Pencils (
    ID int not null,
    Pencil varchar(20) not null,
    ColorID int not null,
    _Available as CAST(1 as bit) persisted,
    constraint PK_Pencils PRIMARY KEY (ID),
    constraint FK_Pencil_Colors FOREIGN KEY (ColorID) references Colors (ID),
    constraint FK_PenciL_Color_AvailabilityXRef FOREIGN KEY (ColorID,_Available) 
                                                      references Colors (ID,Available)
)
你会注意到,严格来说,FK_铅笔颜色现在是多余的。我宁愿保留它,因为它是真正的FK,但其他人可能会选择放弃它

另外请注意,这可以防止在仍有铅笔引用颜色时使颜色不可用,这是一个额外的约束。1

最后,这只是我的惯例,当名字不打算被其他人使用时,我会在名字前面加上uu。他们是来帮我建造DRI的


1作为评论,这实际上可能不是您想要的行为。记住,一般来说,约束是永恒的真理。如果它是一个约束,那么应该可以在不违反约束的情况下删除并重新插入数据。如果您有一个时间要求,例如在插入行的时间点X和Y应该为真,那么通常最好使用触发器来处理这个问题。

如果颜色的可用性从“是”变为“否”,会发生什么情况?在现有行保持有效的情况下是否允许这样做?如果是这样,您不能对此使用约束,但必须使用触发器。
ID(PK):0,1,2

Color:Red, Blue, Green

Availability:Yes, No, No
create table Colors (
    ID int not null,
    Name varchar(30) not null,
    Available bit not null,
    constraint PK_Colors PRIMARY KEY (ID),
    constraint UQ_Color_Names UNIQUE (Name),
    constraint UQ_Color_AvailabilityXRef UNIQUE (ID,Available)
)
go
create table Pencils (
    ID int not null,
    Pencil varchar(20) not null,
    ColorID int not null,
    _Available as CAST(1 as bit) persisted,
    constraint PK_Pencils PRIMARY KEY (ID),
    constraint FK_Pencil_Colors FOREIGN KEY (ColorID) references Colors (ID),
    constraint FK_PenciL_Color_AvailabilityXRef FOREIGN KEY (ColorID,_Available) 
                                                      references Colors (ID,Available)
)