如何创建查询约束

How can I create a query constraint

我有一个 table 项,其中包含字段 Inventory 和 ItemId(主键)。

我还有另一个 table Allocations,它有字段 Allocation 和 ItemId,这是一个引用 Items.ItemId 的外键。

因此许多分配可以与一个项目相关。

我想知道如何添加约束以不允许分配 table 中的 SUM(Allocation) 对于同一 ItemId 加入 Items.Inventory 该 ItemId。我只能找到非常简单的例子,所以我不确定如何解决这个问题。

您可以在 Allocations table 上创建一个调用函数的 CHECK CONSTRAINT。

ItemID 传递给函数并让函数使用 Items.Inventory 填充局部变量 ItemId

之后,让函数执行 SELECT 获取 Allocations table 中的 SUM(Allocation) 以获得相同的 ItemId,并且 return True (1) 如果 SUM 大于 Inventory,否则 False (0).

在CHECK CONSTRAINT中,只测试Function return是否为False.

Tab Allerman 的回答的实现 See demo

CREATE FUNCTION dbo.fnc_IsValid( @ItemId Int)     RETURNS BIT
AS 
BEGIN 
   DECLARE @flag BIT = 1
   SELECT @flag =
   case 
       when 
           ISNULL(SUM(Allocation),0) < =MAX(Inventory)
       then 1
       else 0
   end
   FROM Allocations A (NOLOCK) JOIN Items I
   on A.Itemid=I.Itemid AND I.ItemId=@ItemId
   group by I.ItemId


   RETURN      @flag

 END

 go
 create table Items(ItemId int , Inventory int);
insert into Items values
(1,35),(2,10);

create table Allocations (Allocation int , Itemid int );

ALTER TABLE dbo.Allocations  ADD CONSTRAINT [CK_inventoryCheck] CHECK  ((dbo.fnc_IsValid(Itemid)=1))
go

insert into Allocations values
(10,1),(20,1),(5,1);


select * from Allocations;