mar*_*arc 82 sql-server foreign-keys view
在SQL Server 2008中给出
TableA(A_ID, A_Data)
TableB(B_ID, B_Data)
ViewC(A_or_B_ID, A_or_B_Data)
Run Code Online (Sandbox Code Playgroud)
是否可以定义TableZ(A_or_B_ID, Z_Data)这样的Z.A_or_B_ID列被约束到在ViewC?中找到的值?可以使用外键来查看视图吗?
Bri*_*her 103
您无法在外键中引用视图.
小智 26
在较旧的SQL Server版本中,外键只能通过触发器实现.您可以通过创建一个Insert触发器来模仿自定义外键,该触发器检查插入的值是否也出现在其中一个相关表中.
Dam*_*ver 16
如果你真的需要A_or_B_IDTableZ,你有两个类似的选择:
1)将nullable A_ID和B_ID列添加到表z,A_or_B_ID在这两列上使用ISNULL 创建一个计算列,并添加一个CHECK约束,使得只有一个A_ID或B_ID不为null
2)将TableName列添加到表z,约束为包含A或B.现在创建A_ID和B_ID作为计算列,当它们的相应表被命名时(使用CASE表达式),它们只是非空的.让他们坚持下去
在这两种情况下,您现在拥有A_ID和B_ID列可以具有适当的外键到基表的列.不同之处在于计算哪些列.此外,如果2个ID列的域不重叠,则上面的选项2中不需要TableName - 只要您的case表达式可以确定哪个域A_or_B_ID
属于
(感谢评论修复我的格式)
还有另一种选择。将TableA和TableB视为名为 的新表的子类TablePrime。调整TableB的 ID 值,使其与TableA的 ID 值不一致。在TablePrimePK 中制作 ID并将所有TableA的 和TableB的(调整后的)ID 插入TablePrime. 制作TableA和TableB对他们的PK在同一个ID FK关系TablePrime。
您现在拥有超类型/子类型模式,并且可以对TablePrime(当您想要-A-或-B 时)或单个表之一(当您只需要 A或只需要 B 时)进行约束。
如果您需要更多详细信息,请询问。有一些变化可以让你确保 A 和 B 是互斥的,或者你正在处理的东西可以同时存在。如果可能,最好在 FK 中将其正式化。
| 归档时间: |
|
| 查看次数: |
57941 次 |
| 最近记录: |