如何将校验约束放在列上,使其其可接受值的范围来自另一个表,而无需硬件?

这是一个简化的例子:

OneManyTable
RoleID  TaskID
10      Val1
10      Val2
20      Val1
20      Val2


MetaDataTable
pkID    Class   Value
1       A       Val1
2       A       Val2
3       B       Val3
4       B       Val4
.

我想在onemanytable上给一个check约束.TaskId列,使得可接受的值来自另一个表的列,即来自MetAdataTable.value,其中Metadatable.class='a'

我已经尝试创建格式的check约束

TaskID in (Select Value FROM MetadataTable where class= 'A')
.

但这不受支持。

在另一个手中('val1','val2')中的taskId作为SQL2K8中的检查约束(不在SQL2000中!),但由于硬编码而无法接受。

如何实现我想要的,无论是通过检查约束还是我不知道的一些其他花式机制?

ps。必须在数据库方面,没有客户端检查,因为某人已经向我建议。

有帮助吗?

解决方案

它可能不是一个很好的做法,但是您可以编写一个用户定义的函数,该函数接受您的TaskID作为参数,并根据TaskId落在提供的范围内,评估为True或False。你的MataDatabal。

将允许您获取您正在寻找的功能 - 检查约束真的只是简单的功能,旨在限制列的范围,并且他们的行为牢记,所以这就是为什么无法在SQL Server中的Check Constraint中编写子查询。

但是,您可以在用户定义的函数中写一个选择语句,并从Check约束调用它。

其他提示

从另一个表的值抵御值的约束通常被设计为外键约束。这是旨在将表链接到值的机制。

检查约束实际上仅旨在定义

  • 最小值或最大值
  • 范围
  • 给定值集
  • 的枚举
所以我不认为你可以做你想要做的事情,因为这真的是你想要使用的错误的功能。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top