【问题标题】:Foreign key referencing a view in Oracle外键引用 Oracle 中的视图
【发布时间】:2011-04-19 11:44:33
【问题描述】:

我正在尝试使用外键引用视图,但出现此错误:

“错误:ORA-02270:此列列表没有匹配的唯一键或主键”

但是,我在此视图上创建了一个主键,并在 TOAD 的“约束”选项卡中对其进行了验证。

这是我正在尝试创建的表:

CREATE TABLE QUESTION
(   
    QUESTION_ID             INTEGER not null,
    CREATED_USER_ID         INTEGER not null,    
    CONSTRAINT PK_QUESTION  PRIMARY KEY (QUESTION_ID),
    CONSTRAINT FK_USER
        FOREIGN KEY (CREATED_USER_ID)
        REFERENCES SOME_VIEW(VIEW_ID)
);

SOME_VIEW 是基于另一个视图的视图,它指向另一个模式中的员工表。

【问题讨论】:

  • 我想你想要/需要这个才能拥有一个可能来自多个表的外键,因为一个列可以有多个针对单个列的外键约束......但是值该列必须存在于所有与外部约束相关的表中。我希望这是一种转换数据库的方法,而且只是暂时的。
  • 换句话说,SOME_VIEW、OTHER_VIEW 和 BASE_TABLE 都必须具有相同的值才能使此外键约束起作用?
  • @echoblaze:如果您要将 OTHER_VIEW 的外部约束添加到 SOME_VIEW 和 BASE_TABLE(随意移动名称),可以。
  • @OMG Ponies:我在员工表上没有该权限(这是使用视图的目的);我阅读了您的链接,显然物化视图可能是解决方案-您对此了解很多吗?在此期间,我将阅读更多有关它的信息

标签: sql oracle views foreign-keys


【解决方案1】:

不管为视图创建外键的可能性,这确实不是最好的实现方式。

数据库视图旨在让用户舒适地查询他需要的一些数据,但同时作为安全屏障,隐藏所有数据库结构,包括表、表中的数据约束,以及,是的,还有表交叉-参考。

因此,对我来说,一个好的做法是从您的新表中引用现有表,尽管它位于其他方案中。

【讨论】:

  • 好的,感谢所有反馈。我们决定在应用程序级别而不是数据库级别进行连接
  • 在维度 DWH 建模中有一种叫做角色扮演视图的东西。在那种情况下,这种外键约束似乎无论如何都是一个好习惯。
  • 我不太确定我是否完全同意。想象一个 Departments 表,其中包含所有具有 chief 列的记录。由于一个chief 可以负责多个department,我将创建另一个表Chiefs。由于员工可能有离职日期,我会在 chiefs 表中添加 entrydateseparationdate 列,并参考 部门 A、B 和C 到首席 #2 现在有效。这将需要行过滤,我可以在像 currentchiefs 这样的视图中实现,我将连接到 departments 而不是源表 chiefs .
【解决方案2】:

您可以做的最好的事情是将 SOME_VIEW 实现为物化视图,因为您指向另一个模式。 然后,您可以更改物化视图以添加主键,甚至可以从外键引用此视图。

这是您应该阅读的文档: https://docs.oracle.com/cd/A97630_01/server.920/a96567/repmview.htm

【讨论】:

    【解决方案3】:

    针对视图的外键可能是造成问题的原因。

    【讨论】:

    • 视图不能有外键吗?
    猜你喜欢
    • 1970-01-01
    • 2018-08-24
    • 1970-01-01
    • 2015-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多