Sql server 如何在不使用外键的情况下将列限制为另一个表中的特定值?

Sql server 如何在不使用外键的情况下将列限制为另一个表中的特定值?,sql-server,Sql Server,这是针对SQL Server 2008的 我有一个主查找表,如下所示: Mstr_lookup_ID *Lookup_ID* *Lookup_Category* Lookup_Value 1 1 States CA 2 2 States NY 3 1 Airline

这是针对SQL Server 2008的

我有一个主查找表,如下所示:

Mstr_lookup_ID  *Lookup_ID*   *Lookup_Category*   Lookup_Value
      1              1            States            CA
      2              2            States            NY
      3              1            Airlines          SWA
      4              2            Airlines          United
      5              3            Airlines          American
我的主键在
Lookup\u ID
Lookup\u Category
上。我有一个表,我想根据
Lookup\u ID
Lookup\u Category
的组合来限制某些列中的值

Create Table Main_Table 
(State_id    INT      --ONLY VALUES ALLOWED SHOULD BE 1-2
 Airline_id  INT)     --ONLY VALUES ALLOWED SHOULD BE 1-3
有没有办法干净利落地做到这一点?我想为它创建一个外键,但我的主键在两列上。如果您有任何想法或建议,我将不胜感激。

那么,您有“一个大的查找表”吗

要创建FK(并且没有其他声明性的方式根据查找表限制值,否则您可以使用触发器),您必须将另一列添加到
main\u表
,即
lookup\u category
列,并使用这两列将引用绘制到查找表中的主键。

请参阅

你想做的是他们的观点

乍一看,这听起来是个好主意。只有一张桌子而不是很多

但事实并非如此,正是因为它违背了查找表的主要目的——能够强制执行引用完整性

不要这样做-对每个类别使用单独的查找表,并使用适当的引用完整性


唯一可行的方法是在这个“全局”查找表上有一个
INT-IDENTITY
,但该ID在所有类别中都是“全局”的。然后,您可以仅根据一个ID引用此全局查找表。缺点是,您的类别不会都有很好的连续数字-它会到处都是。

请参见-这是第1点。一开始,这听起来是个不错的主意——但事实并非如此,因为它违背了查找表的主要目的——能够强制执行引用完整性。不要这样做-对每个类别使用单独的查找表,并使用适当的引用完整性!marc_s,你应该做出一个正式的回答。@marc_s:是的,我认为“不要因为你已经开始遇到的问题而这样做”应该是一个可以接受的答案。你试图让这看起来像是一个类别关系,但事实并非如此。这确实是典型的主代码表错误。我喜欢这篇文章中的第一条。我尝试使用单独的查找表,但被否决了。我可能会再试一次,或者我将不得不删除第二列,只需将第一列作为主键并使用它,这是我试图避免的。感谢你们所有人的及时和深思熟虑的回复。