我有一个查找表
Tbl_UserType_value_lookup:
UserTypeID |AllowedValue
-------------------------
1 |x
1 |y
2 |u
3 |a
(这表示类型为1
的用户只能输入x
和y
类型的值,而不能输入u
或{{1}类型的值} ...等等)
我有另一张桌子
a
现在,在此表中,如何使用Tbl_Activity:
UserID |userTypeID |value
---------------------------
约束将1
类型的用户重新转换为Tbl_UserType_value_lookup
表的值?
还有其他办法吗?
答案 0 :(得分:3)
假设Tbl_UserType_value_lookup
UserTypeID, Allowed Value
上有一个唯一键,Tbl_Activity
可以在Tbl_UserType_value_lookup
上有一个引用这些列的复合外键。
(即UserType,Value的组合必须存在{{1}}才能插入。
这里有很多关于此的讨论:
答案 1 :(得分:0)
CHECK约束通过限制列接受的值来强制域完整性。它们类似于FOREIGN KEY约束,因为它们控制放入列中的值。 区别在于它们如何确定哪些值有效:FOREIGN KEY约束从另一个表获取有效值的列表,CHECK约束从不基于另一列中的数据的逻辑表达式确定有效值。 / strong>例如,可以通过创建CHECK约束来限制工资列的值范围,该约束仅允许范围从$ 15,000到$ 100,000的数据。这可以防止工资超出正常工资范围。
使用外国钥匙!
<强>更新强> 有关详情,请查看HERE。
答案 2 :(得分:0)
我认为您无法创建动态CHECK
约束。
使用外键将Tbl_Activity
与Tbl_UserType_value_lookup
相关联。
您想要的是一个在数据结构中无法轻松实施的应用程序规则。
答案 3 :(得分:0)
Tbl_Activity:
FOREIGN KEY allowed_value(userTypeID, Value)
REFERENCES Tbl_UserType_value_lookup (userTypeID, AllowedValue)
;
(如果您的SQL平台支持复合外键,否则您将不得不破解一些丑陋的触发器和/或使用代理键)
BTW:在表名和列名中避免使用MixedCase。通常情况下,SQL 不区分大小写,但如果您的数据库必须移动到区分大小写的安装,那么您将会痛苦地哭泣。混合MixedCase和under_scores被认为是Bad_Style(大多数人都认为)。