Jac*_*one 31 sql sql-server sql-server-2005
假设我有一个名为ProjectTimeSpan的表(我没有,仅作为示例!)包含StartDate和EndDate列.
而且,我有叫另一个表SubProjectTimeSpan,还含有列称为起始日期和结束日期,在这里我想设置一个检查约束,使得它不可能起始日期日期和结束日期设置为值"外"的ProjectTimeSpan.StartDate到ProjectTimeSpan.EndDate
一个检查约束的种类知道关于另一个表中的值...
这可能吗?
And*_*mar 42
在回答您对GSerg答案的评论时,这是使用函数的示例检查约束:
alter table YourTable
add constraint chk_CheckFunction
check (dbo.CheckFunction() = 1)
你可以在哪里定义函数:
create function dbo.CheckFunction()
returns int
as begin
    return (select 1)
end
该函数允许引用其他表.
将ProjectTimeSpan表的键的复合键与StartDate和EndDate列组合在一起,然后使用此复合键作为SubProjectTimeSpan表中的外键引用.这将使您能够CHECK在SubProjectTimeSpan表中编写必要的行级约束,例如
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...
);