我使用的是SQL Server 2012,我有一个包含IDSitesPtoP
列(int
)的表,它包含对另一个表的外键引用。拨打第一个表格' TableA'。第二个表TableB有一列IDSite
(int
),它是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中不支持此功能......?
答案 0 :(得分:3)
不幸的是,修复语法错误并没有解决问题:
IDSitePtoP int CONSTRAINT CHECK
(TableA.IDSitePtoP IN (SELECT IDSite FROM TableB WHERE TableB.IsDC=0));
约束中不允许使用子查询。您可以创建一个UDF来执行此操作。但是,假设IDSITE, IsDC
在TableB
中是唯一的,那么还有另一种方法可行。如果是,请创建唯一索引并使用外键索引:
create unique index tableB(IdSite, IsDC);
create table . . .
IDSItePtoP int,
IsDc = 0,
foreign key (IDSItePtoP, IsDC) references TableB(IdSite, IsDC)
请注意,我正在使用计算列作为外键约束。说实话,我从来没有创建一个具有常量值的外键约束,所以我不是百分之百肯定会有效。
答案 1 :(得分:0)
我认为您不需要任何检查约束,因为如果主键中不存在该记录,则无法在外键列中插入记录。