我有一个表项,其中包含Inventory和ItemId(主键)字段。
我有另一个表Allocations,它有字段Allocation和ItemId,它是一个引用Items.ItemId的外键。
因此,许多分配可以与一个项目相关。
我想知道如何添加一个约束来不允许Allocations表中的SUM(Allocation)为同一ItemId加入ItemId的Items.Inventory。我只能找到非常简单的例子,所以我不确定如何处理这个问题。
答案 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;