检查约束是否与另一个表相关?

比方说,我有一个名为ProjectTimeSpan (包括StartDateEndDate的列)的表(我没有,只是作为示例!)。

而且我有另一个名为SubProjectTimeSpan的表,也包含名为StartDateEndDate的列,在这里我想设置一个Check约束 ,使得无法将StartDate和EndDate设置为ProjectTimeSpan.StartDateProjectTimeSpan.EndDate之外的值

知道 其他表值的Check约束的种类…

这可能吗?

为了回应你对GSerg答案的评论,下面是一个使用函数的示例检查约束:

alter table YourTable add constraint chk_CheckFunction check (dbo.CheckFunction() = 1) 

你可以在哪里定义这个function:

 create function dbo.CheckFunction() returns int as begin return (select 1) end 

该函数被允许引用其他表。

您可以创build一个用户定义的函数来执行检查并返回1或0,然后创build一个check约束,提供项目ID和date作为参数。

使ProjectTimeSpan表的密钥与StartDateEndDate列结合在一起,然后在SubProjectTimeSpan表中使用此复合键作为外键引用。 这将使您能够在SubProjectTimeSpan表中编写必要的行级CHECK约束

 CREATE TABLE ProjectTimeSpan ( project_ID INTEGER NOT NULL UNIQUE, -- key StartDate DATE NOT NULL, EndDate DATE NOT NULL, CHECK (StartDate < EndDate), UNIQUE (project_ID, StartDate, EndDate) -- compound key -- other project columns here... ); CREATE TABLE SubProjectTimeSpan ( project_ID INTEGER NOT NULL, StartDate DATE NOT NULL, EndDate DATE NOT NULL, FOREIGN KEY (project_ID, StartDate, EndDate) REFERENCES ProjectTimeSpan (project_ID, StartDate, EndDate) ON DELETE CASCADE ON UPDATE CASCADE, sub_StartDate DATE NOT NULL, sub_EndDate DATE NOT NULL, CHECK (sub_StartDate < sub_EndDate), CHECK (StartDate <= sub_StartDate), -- sub project can't start before main project CHECK (sub_EndDate <= EndDate) -- sub project can't end after main project -- other sub project columns here... ); 

您需要在父表和子表上添加约束,因为子项目不能超出项目范围,但项目范围不能移出所有子项目。

在这种情况下,您应该使用事务延迟上层(webservice,应用程序)上的约束检查,以确保您的数据在两个表上的多个查询后都处于有效状态!