创建列,检查总数是否超过另一列... SQL Server

问题描述 投票:0回答:2

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列值?谢谢

sql sql-server
2个回答
2
投票

您需要创建一个从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))

1
投票

您可以使用用户定义的函数或触发器来执行此操作。

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) );
© www.soinside.com 2019 - 2024. All rights reserved.