小编典典

约束检查外键的值

sql

我有这两张表

Table: Guards

ID int
Name varchar
Rank int

Table: Squads

SquadId
Leader
SquadName

Leader列指向表中的ID列,Guard我正在尝试创建一个约束,以检查Rank链接到作为领导者提供的保护ID的列是否为特定值(在本例中为1)

这可能吗?还是我必须使用扳机?


阅读 143

收藏
2021-04-28

共1个答案

小编典典

您需要添加一个CHECK约束。我将约束包装到一个函数中,因为您需要检查另一个表的值。

CREATE FUNCTION CheckLeaderRank
(@LeaderID INTEGER)
RETURNS INTEGER
AS 
BEGIN
DECLARE @value INTEGER;
DECLARE @MinimumRank INTEGER = 3;

SET @value = CASE WHEN (SELECT RANK FROM Guards WITH(NOLOCK) WHERE Id = @LeaderID) >= @MinimumRank THEN 1 ELSE 0 END

RETURN @value
END

该函数将检查防护等级Rank是否足够高:请确保将其设置@MinimumRank为适当的值,或者甚至更好地从另一个表中获取它。

现在将约束添加到Squads表中。

ALTER TABLE Squads
ADD CONSTRAINT chk_rank CHECK (dbo.CheckLeaderRank(i) = 1)
2021-04-28