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)
Run Code Online (Sandbox Code Playgroud)
你可以在哪里定义函数:
create function dbo.CheckFunction()
returns int
as begin
return (select 1)
end
Run Code Online (Sandbox Code Playgroud)
该函数允许引用其他表.
将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...
);
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
39870 次 |
| 最近记录: |