假设我有一个名为ProjectTimeSpan的数据表(我没有这个数据表,只是举例而已!),其中包含数据行StartDate和EndDate。
我还有另一个名为SubProjectTimeSpan的表,其中也包含名为StartDate和EndDate的列,我想在其中设置一个 *Check约束 *,使StartDate和EndDate不能设置为ProjectTimeSpan.StartDate到ProjectTimeSpan.EndDate“之外”的值
一种检查约束,它 * 知道 * 关于 * 另一个 * 表的值...
这可能吗?
6条答案
按热度按时间but5z9lq1#
作为对您对GSerg答案的评论的回应,下面是一个使用函数的示例检查约束:
您可以在其中定义如下函数:
允许函数引用其他表。
niwlg2el2#
您可以创建一个user-defined function来执行检查并返回1或0,然后在其上创建一个
check
约束,并提供项目ID和日期作为参数。8yoxcaq73#
将
ProjectTimeSpan
表的键与StartDate
和EndDate
列组合成一个复合键,然后将此复合键用于SubProjectTimeSpan
表中的外键引用。这样给予您就可以在SubProjectTimeSpan
表中写入必要的行级CHECK
约束条件,例如:2eafrhcq4#
您当然 * 可以 * 做到这一点,正如许多答案所显示的那样。但是,您应该知道,SQL Server在使用UDF的
CHECK CONSTRAINT
方面似乎有问题:https://dba.stackexchange.com/questions/12779/how-are-my-sql-server-constraints-being-bypassed
kknvjkwl5#
您需要在父表和子表上添加约束,因为子项目不能超出项目范围,但项目范围也不能移出所有子项目。
在这种情况下,您应该推迟对事务的上层(Web服务、应用程序)的约束检查,以确保在对两个表进行多次查询后,您的数据处于有效状态!
ljo96ir56#
这是绝对可能的,而且实际上非常简单。就像你的例子:
但请注意,这不会有特别好的表现。