Sql server 如何在不使用外键的情况下将列限制为另一个表中的特定值?
这是针对SQL Server 2008的 我有一个主查找表,如下所示: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
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:是的,我认为“不要因为你已经开始遇到的问题而这样做”应该是一个可以接受的答案。你试图让这看起来像是一个类别关系,但事实并非如此。这确实是典型的主代码表错误。我喜欢这篇文章中的第一条。我尝试使用单独的查找表,但被否决了。我可能会再试一次,或者我将不得不删除第二列,只需将第一列作为主键并使用它,这是我试图避免的。感谢你们所有人的及时和深思熟虑的回复。