我可以有一个外键在SQL Server中的视图中引用列吗?

在SQL Server 2008中,并给出

TableA(A_ID, A_Data) TableB(B_ID, B_Data) ViewC(A_or_B_ID, A_or_B_Data) 

是否可以定义TableZ(A_or_B_ID, Z_Data) ,使Z.A_or_B_ID列被约束在Z.A_or_B_IDfind的值? 这可以用一个外键来完成吗?

您不能在外键中引用视图。

在以前的SQL Server版本中,外键只能通过触发器来实现。 您可以通过创build一个插入触发器来模仿一个自定义的外键,该插入触发器检查插入的值是否也出现在相关的一个表中。

如果你真的需要A_or_B_ID中的A_or_B_ID,你有两个类似的选项:

1)将可空的A_IDB_ID列添加到表z中,使用这两列上的ISNULL使A_or_B_ID成为计算列,并添加CHECK约束,使得只有A_IDB_ID中的一个不为null

2)在表z中添加一个TableName列,约束为包含A或B.现在创buildA_IDB_ID作为计算列,当它们的相应表被命名(使用CASEexpression式)时,它们只是非空的。 让他们也坚持

在这两种情况下,您现在都有A_IDB_ID列,这些列可以对基表具有适当的外键。 不同之处在于计算列。 另外,如果2个I​​D列的域不重叠,则不需要上面的选项2中的TableName,只要您的情况expression式可以确定哪个域A_or_B_ID落入

(感谢评论修复我的格式)

对不起,你不能在SQL Server中查看视图。

还有另一种select。 将TableA和TableB视为一个名为TablePrime的新表的子类。 调整TableB的ID值,使其与TableA的ID值不一致。 使TablePrime中的ID成为PK,并将TableA和TableB(已调整)的所有ID插入到TablePrime中。 使TableA和TableB在其PK中具有与TablePrime中的相同ID的FK关系。

您现在拥有超types/子types模式,并且可以对TablePrime(当您需要-A或-B )或其中一个单独的表(当您只需要A只有B时 )进行约束。

如果您需要更多的细节,请询问。 有一些变化可以让你确定A和B是相互排斥的,或者你正在使用的东西可以同时存在。 如果可能的话,最好在FK中正规化。

添加一个引用用户自定义函数的约束会更容易,fCheckIfValueExists(columnValue)在值存在时返回true,否则返回false。

好处是它可以接收多列,执行计算,接受空值并接受与主键不完全对应的值或者与连接结果进行比较。

缺点是优化器不能使用所有的外键技巧。