如何创建查询约束

时间:2018-06-06 17:37:34

标签: sql sql-server constraints sql-server-2000

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

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

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

我想知道如何添加一个约束来不允许Allocations表中的SUM(Allocation)为同一ItemId加入ItemId的Items.Inventory。我只能找到非常简单的例子,所以我不确定如何处理这个问题。

2 个答案:

答案 0 :(得分:4)

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

ItemID传递给该函数,并让该函数使用Items.Inventory的{​​{1}}填充局部变量。

之后,让函数执行SELECT,使ItemId表中的SUM(Allocation)获得相同的Allocations,如果SUM大于ItemId,则返回True (1) Inventory,或者False (0)

在CHECK CONSTRAINT中,只测试函数是否返回False

答案 1 :(得分:1)

实施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;