【问题标题】:Foreign Key off of a UNIONed ViewUNIONed 视图的外键
【发布时间】:2013-07-23 22:21:34
【问题描述】:

我的视图如下所示:

CREATE view   reference.Test WITH SCHEMABINDING  as

    SELECT        reference.HighlevelTestId as TestId, Name, IsActive,
                  cast(1 as bit) as IsHighLevelTest 
    FROM          reference.HighlevelTest

    UNION ALL

    SELECT        LowLevelTestId  as TestId, Name, IsActive, 
                  cast(0 as bit) as IsHighLevelTest  
    FROM          reference.LowLevelTest

GO

注意:HighLevelTestId 和 LowLevelTestId 保证永远不会有相同的值(没有冲突)。

我有另一个看起来像这样的表:

CREATE TABLE [Reference].[TestAddition](
    [TestId] [BigInt] NOT NULL,
    [OtherStuff] [bit] NOT NULL,
    .... 
) 

我真的很想在 TestId 列上将我的 TestAddition 表 FK 到我的 Test 视图(为了引用完整性和 OData 的易用性)。

有什么办法吗?

【问题讨论】:

  • 也许CHECK CONSTRAINT 作为函数msdn.microsoft.com/en-us/library/ms188258(v=sql.105).aspx 就足够了吗?仅供参考。
  • 认真的吗? “FK关……”?你可能想改写一下。
  • 我想不出在包含联合的视图上伪造主键的方法,但这并不妨碍您加入该视图。这只是意味着您将自己管理参照完整性,而不是依赖数据库来完成。你已经说过“HighLevelTestId 和 LowLevelTestId 保证永远不会有相同的值”,所以你已经成功了 :)
  • HighLevelTestId 和 LowLevelTestId 如何保证永远不会有相同的值?为什么是两张表?
  • @Blam - HighLevelTestId 和 LowLevelTestId 值是从不重叠的业务数据中生成的。它们是两个不同的概念(一个通常拥有另一个),但它们有时被视为一个单一的“测试”概念(在这种情况下)。

标签: sql-server tsql sql-server-2012


【解决方案1】:

外键不能应用于视图。从这个角度来理解:您不能将引用完整性应用于仅由 SELECT 语句返回的结果,因为它们不是永久存储的,它们只是查询的非持久输出。

要管理参照完整性,请在永久存储数据时将外键或其他此类约束应用于数据 - 在您的情况下,例如在表 IsHighLevelTestIsLowLevelTest 中。或者通过将UNION 的结果存储在表格中来使其永久化。还有更多方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-01
    • 2011-04-19
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    • 1970-01-01
    • 2020-04-12
    • 1970-01-01
    相关资源
    最近更新 更多