当前位置:  开发笔记 > 数据库 > 正文

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

如何解决《我可以在SQLServer的视图中使用引用列的外键吗?》经验,为你挑选了4个好方法。

在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列被约束到在ViewC?中找到的值?可以使用外键来查看视图吗?



1> Brian Fisher..:

您无法在外键中引用视图.


这是SQL服务器的限制还是想要不合理的事情?
这是对这些后续问题的一个很好的答案 - http://stackoverflow.com/questions/3833150/foreign-key-referencing-a-view-in-oracle

2> 小智..:

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


欢迎来到StackOverflow.我在你的答案中找到了价值,因为提供了一个解决方法,但正确的答案是被接受的答案,问题是超过4年,所以我只是没有投票,但不想没有这个评论.

3> Damien_The_U..:

如果你真的需要A_or_B_IDTableZ,你有两个类似的选择:

1)将nullable A_IDB_ID列添加到表z,A_or_B_ID在这两列上使用ISNULL 创建一个计算列,并添加一个CHECK约束,使得只有一个A_IDB_ID不为null

2)将TableName列添加到表z,约束为包含A或B.现在创建A_IDB_ID作为计算列,当它们的相应表被命名时(使用CASE表达式),它们只是非空的.让他们坚持下去

在这两种情况下,您现在拥有A_IDB_ID列可以具有适当的外键到基表的列.不同之处在于计算哪些列.此外,如果2个I​​D列的域不重叠,则上面的选项2中不需要TableName - 只要您的case表达式可以确定哪个域A_or_B_ID 属于

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



4> Jarrett Meye..:

对不起,你不能FK到SQL Server中的视图.

推荐阅读
郑谊099_448
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有