Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 使用引用物化视图上主键的外键创建Oracle表_Sql_Oracle_Oracle11g_Materialized Views - Fatal编程技术网

Sql 使用引用物化视图上主键的外键创建Oracle表

Sql 使用引用物化视图上主键的外键创建Oracle表,sql,oracle,oracle11g,materialized-views,Sql,Oracle,Oracle11g,Materialized Views,我在Oracle中有几个具体化的视图,我可以通过查询来获取信息 现在我想创建几个带有外键的表来引用这些mv,为此,我已经向mv添加了相应的主键,如中所述 然后,当我执行SQL create table查询时,我得到一个Oracle ORA-02270错误:在开始的位置0处没有与此列列表匹配的唯一或主键错误 我做错什么了吗?我想做的可能吗? 如果没有,通常是如何进行的?说明: 视图约束 Oracle不强制执行视图约束。然而,在这方面的行动 视图受上定义的完整性约束的约束 基础基表。这意味着您可以在

我在Oracle中有几个具体化的视图,我可以通过查询来获取信息

现在我想创建几个带有外键的表来引用这些mv,为此,我已经向mv添加了相应的主键,如中所述

然后,当我执行SQL create table查询时,我得到一个Oracle ORA-02270错误:在开始的位置0处没有与此列列表匹配的唯一或主键错误

我做错什么了吗?我想做的可能吗? 如果没有,通常是如何进行的?

说明:

视图约束

Oracle不强制执行视图约束。然而,在这方面的行动 视图受上定义的完整性约束的约束 基础基表。这意味着您可以在上强制约束 通过基表上的约束查看

而且:

视图约束是表约束的子集,受 以下限制:

... 仅在禁用NOVALIDATE模式下支持视图约束。不能指定任何其他模式。必须指定关键字DISABLE 当您声明视图约束时。您不需要指定NOVALIDATE 显式地,因为它是默认值。 ... 在实践中,上述情况意味着,尽管可以创建视图上的约束,但它们被阻止且不起作用。好像他们根本不是

除此之外,考虑一下在表上创建外键constrainst有什么意义,它将引用物化视图:

表总是在线的,并且总是有新的数据 物化视图可以包含过时的数据 想象一下这种情况:将记录X插入到某个表中。此记录在物化视图中尚不可见,因为此时未刷新视图。然后尝试将记录X插入到另一个表中,该表具有指向该物化视图的外键约束。数据库应该做什么?数据库是否应该拒绝insert语句,因为目前X在视图中还不可见,并且外键存在?如果是,那么数据完整性如何?也许它应该阻止amd直到视图刷新?在这种情况下,是否应该强制视图开始刷新?
如您所见,这种情况在实现中涉及许多问题和难题,因此Oracle不允许对视图进行约束。

当其他表的外键引用物化视图时,您必须注意视图刷新方法以及它如何影响外键。 有两件事可能会阻止您刷新物化视图:

1引用视图的表中的数据可能引用需要更新或删除的线。在这种情况下,您必须修复数据

2视图的刷新方法已完成。在“完全刷新”中,Oracle将删除mviews表中的所有数据,并通过重新运行查询来重新填充这些数据,如中所示,而在“快速刷新”中,仅将差异应用于mviews表。快速刷新是一种增量刷新,只有当数据不尊重外键时,它才会起作用

现在,如果有一些mview不能通过快速刷新(Oracle称之为复杂查询)创建,那么您可以将这些mview的约束更改为可延迟的,正如您所看到的

这样,即使是完全刷新也可以工作,因为Oracle只在当前事务结束时验证可延迟的约束。因此,只要您的刷新方法是原子的,Oracle就会在一个事务中发出一个DELETE命令,然后重新插入所有行

换句话说,在刷新mview的下一个命令中,将参数atomic_refresh保持为true:

dbms_mview.refresh(LIST=>'MVIEW', METHOD =>'C', ATOMIC_REFRESH => TRUE);
顺便说一句,这个参数的默认值是TRUE,所以不必提及它,它会起作用。

查看此链接