使用查找表通过约束限制值

时间:2012-02-24 10:38:27

标签: sql tsql constraints lookup-tables

我有一个查找表

Tbl_UserType_value_lookup:

UserTypeID  |AllowedValue
-------------------------
1           |x
1           |y
2           |u
3           |a

(这表示类型为1的用户只能输入xy类型的值,而不能输入u或{{1}类型的值} ...等等)

我有另一张桌子

a

现在,在此表中,如何使用Tbl_Activity: UserID |userTypeID |value --------------------------- 约束将1类型的用户重新转换为Tbl_UserType_value_lookup表的值?

还有其他办法吗?

4 个答案:

答案 0 :(得分:3)

假设Tbl_UserType_value_lookup UserTypeID, Allowed Value上有一个唯一键,Tbl_Activity可以在Tbl_UserType_value_lookup上有一个引用这些列的复合外键。

(即UserType,Value的组合必须存在{{1}}才能插入。

这里有很多关于此的讨论:

Creating a composite foreign key in SQL Server 2008

答案 1 :(得分:0)

CHECK约束通过限制列接受的值来强制域完整性。它们类似于FOREIGN KEY约束,因为它们控制放入列中的值。 区别在于它们如何确定哪些值有效:FOREIGN KEY约束从另一个表获取有效值的列表,CHECK约束从不基于另一列中的数据的逻辑表达式确定有效值。 / strong>例如,可以通过创建CHECK约束来限制工资列的值范围,该约束仅允许范围从$ 15,000到$ 100,000的数据。这可以防止工资超出正常工资范围。

使用外国钥匙!


<强>更新 有关详情,请查看HERE

答案 2 :(得分:0)

我认为您无法创建动态CHECK约束。 使用外键将Tbl_ActivityTbl_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(大多数人都认为)。