SQL Server - 检查约束 - 没有子查询?

时间:2014-03-18 11:06:35

标签: sql sql-server

我使用的是SQL Server 2012,我有一个包含IDSitesPtoP列(int)的表,它包含对另一个表的外键引用。拨打第一个表格' TableA'。第二个表TableB有一列IDSiteint),它是TableB的主键。

我想对TableA.IDSitePtoP进行检查约束,这基本上确认提供的值存在于TableB.IDSite中,但是使用where子句进行过滤。我相信我可以在列的表定义中使用子查询来执行此操作,如下所示:

IDSitePtoP int CONSTRAINT CHECK (NOT EXISTS
    (SELECT IDSite FROM TableB WHERE TableB.IsDC=0));

不幸的是,这种方法似乎不起作用,不知道我在那里有什么不对吗?

我得到的错误是:

  

Msg 1046,Level 15,State 1,Line 12
  在此上下文中不允许子查询。只允许使用标量表达式。

我是否应该完全不同地接近这一点,在我看来,SQL Server中不支持此功能......?

2 个答案:

答案 0 :(得分:3)

不幸的是,修复语法错误并没有解决问题:

IDSitePtoP int CONSTRAINT CHECK
    (TableA.IDSitePtoP IN (SELECT IDSite FROM TableB WHERE TableB.IsDC=0));

约束中不允许使用子查询。您可以创建一个UDF来执行此操作。但是,假设IDSITE, IsDCTableB中是唯一的,那么还有另一种方法可行。如果是,请创建唯一索引并使用外键索引:

create unique index tableB(IdSite, IsDC);

create table . . .
    IDSItePtoP int,
    IsDc = 0,
    foreign key (IDSItePtoP, IsDC) references TableB(IdSite, IsDC)

请注意,我正在使用计算列作为外键约束。说实话,我从来没有创建一个具有常量值的外键约束,所以我不是百分之百肯定会有效。

答案 1 :(得分:0)

我认为您不需要任何检查约束,因为如果主键中不存在该记录,则无法在外键列中插入记录。