检查约束是否与另一个表相关?
比方说,我有一个名为ProjectTimeSpan (包括StartDate和EndDate的列)的表(我没有,只是作为示例!)。
而且我有另一个名为SubProjectTimeSpan的表,也包含名为StartDate和EndDate的列,在这里我想设置一个Check约束 ,使得无法将StartDate和EndDate设置为ProjectTimeSpan.StartDate到ProjectTimeSpan.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
表的密钥与StartDate
和EndDate
列结合在一起,然后在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,应用程序)上的约束检查,以确保您的数据在两个表上的多个查询后都处于有效状态!