SQL Server - 检查列在其他表中的列上的约束
-
12-09-2020 - |
题
如何将校验约束放在列上,使其其可接受值的范围来自另一个表,而无需硬件?
这是一个简化的例子:
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约束调用它。其他提示
从另一个表的值抵御值的约束通常被设计为外键约束。这是旨在将表链接到值的机制。
检查约束实际上仅旨在定义
- 最小值或最大值
- 范围
- 给定值集 的枚举
不隶属于 StackOverflow