SQL Server 2016
我有一个包含这些列的表:
CREATE TABLE [dbo].[Site]
(
[Id] [int] IDENTITY(1,1) NOT NULL,
[SiteId] [int] NOT NULL,
[WellId] [int] NOT NULL,
[TotalOil] [int] NOT NULL,
)
我正在创建另一个表:
CREATE TABLE [dbo].[Reserves]
(
[Id] [int] IDENTITY(1,1) NOT NULL,
[SiteId] [int] NOT NULL,
[WellId] [int] NOT NULL,
[TotalOil] [int] NOT NULL,
[TotalGas] [int] NOT NULL,
....
)
我希望其中一列有一个约束,总数不能超过我的TotalOil
表的Site
。
我尝试了以下方法:
ALTER TABLE [dbo].[Reserves]
ADD CHECK (TotalOil <= [dbo].Site.[TotalOil])
这会在SSMS中引发错误:
无法绑定多部分标识符“dbo.Site.TotalOil”。
如何添加一个约束,确保TotalOil
表中的Reserves
列不超过TotalOil
表中的Site
列值?谢谢
您需要创建一个从Site表返回TotalOil的函数,并在check约束中引用它。
CREATE FUNCTION dbo.TotalOil(@SiteId INT) RETURNS INT
AS BEGIN
RETURN (
SELECT
TotalOil
FROM dbo.Site
WHERE SiteId = @SiteId)
END
然后,您可以在Reserve表的check约束中引用它:
ALTER TABLE dbo.Reserves ADD CHECK ( TotalOil <= dbo.TotalOil(SiteId))
您可以使用用户定义的函数或触发器来执行此操作。
create function usp_get_totaloil (
@siteId int
) returns int as
begin
declare @TotalOil int;
select @TotalOil = s.TotalOil
from [dbo].Site s
where s.SiteId = @siteId;
return @TotalOil;
end;
然后check
约束看起来像:
ALTER TABLE [dbo].[Reserves] ADD CHECK ( TotalOil <= dbo.usp_get_totaloil(site) );