当前位置: 首页 > 图文教程 > 数据库 > Oracle > 理解物化视图刷新过程中出现的约束冲突

Oracle
常见的一些Oracle初学者的问题
ORACLE认证系统概述
数据库考试简介:Oracle认证
Oracle认证基础知识介绍
ADO连接Oracle Access示例及记录集处理源码
SQL Server和MySQL的安全性分析
用Oracle和SQL Server数据库组合利弊分析
Oracle 11g分区功能新革命
Flashback Query 恢复误删除的数据
基于Oracle高性能动态SQL程序开发
怎样在Oracle 9i中正确的转换时区
Oracle 10g导出的数据库能否导入Oracle 9i?
增加Distinct后查询效率反而提高
Oracle限制返回结果集的大小
Java语言数据库操作的基本流程
美国甲骨文(ORACLE)公司入驻渝中区大都会商厦
RHEL AS4上安装oracle 10R2 的方法
DB中如何查询Table占用空间的大小
编写高质量高性能的MySQL语法
Oracle数据库自动备份的具体实现步骤

Oracle 中的 理解物化视图刷新过程中出现的约束冲突


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-31   浏览: 202 ::
收藏到网摘: n/a

本文通过实例的方法来帮助您理解物化视图刷新过程中出现的约束冲突问题。

即使将物化视图的约束建立和基表完全一致,由于物化视图的刷新机制,也会产生约束冲突的现象。

一个简单的例子:


SQL> CREATE TABLE T (ID NUMBER PRIMARY KEY, NAME VARCHAR2(30));--表已创建SQL> ALTER TABLE T ADD CONSTRAINT UN_T_NAME UNIQUE (NAME);--表已更改SQL> CREATE MATERIALIZED VIEW LOG ON T;--实体化视图日志已创建:SQL> CREATE MATERIALIZED VIEW MV_T REFRESH FAST AS SELECT * FROM T;--实体化视图已创建。SQL> ALTER TABLE MV_T ADD CONSTRAINT UN_MV_T_NAME UNIQUE (NAME);--表已更改:SQL> INSERT INTO T VALUES (1, 'A');--已创建 1 行:SQL> INSERT INTO T VALUES (2, 'B');--已创建 1 行:SQL> COMMIT;--提交完成:SQL> EXEC DBMS_MVIEW.REFRESH('MV_T') --PL/SQL 过程已成功完成。

上面构造了一个简单的物化视图,物化视图和基表建立了相同的唯一约束。

下面进行一个循环的更新操作,然后观察刷新的情况:

SQL> UPDATE T SET NAME = 'C' WHERE ID = 1;--已更新 1 行。SQL> UPDATE T SET NAME = 'A' WHERE ID = 2;--已更新 1 行。SQL> UPDATE T SET NAME = 'B' WHERE ID = 1;--已更新 1 行。SQL> COMMIT;--提交完成。SQL> EXEC DBMS_MVIEW.REFRESH('MV_T')BEGIN DBMS_MVIEW.REFRESH('MV_T'); END;*ERROR 位于第 1 行:ORA-12008: 实体化视图的刷新路径中存在错误ORA-00001: 违反唯一约束条件 (YANGTK.UN_MV_T_NAME)ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 794ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 851ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 832 ORA-06512: 在line 1

刷新失败了。解决这个问题的一个方法是对于物化视图不建立唯一约束,唯一性由基表保证。但是这种方法只对只读物化视图适用。而且,缺少唯一约束信息,可能会影响SQL的执行计划。

这种情况下,最好的解决方法是建立延迟约束。

SQL> ALTER TABLE MV_T DROP CONSTRAINT UN_MV_T_NAME;--表已更改。SQL> ALTER TABLE MV_T ADD CONSTRAINT UN_MV_T_NAME UNIQUE (NAME) DEFERRABLE;--表已更改。SQL> EXEC DBMS_MVIEW.REFRESH('MV_T') --PL/SQL 过程已成功完成。

注意,延迟唯一约束对应的索引也必须是非唯一的,否则无法达到延迟约束的目的。