如何创建查询约束
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;
我有一个 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;