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

Oracle
Oracle数据库系统紧急故障处理方法
Oracle SQL性能优化系列学习一
Oracle 数据库操作技巧集
Oracle组件实现动态Web数据库
ORACLE常见错误代码的分析与解决二
ORACLE常见错误代码的分析与解决三
在Oracle 8x实现自动断开后再连接
深刻理解Oracle数据库的启动和关闭
Oracle对两个数据表交集的查询
Oracle 8i字符集乱码问题析及其解决办法
Oracle 数据库管理脚本命名规范
Oracle不同数据库间对比分析脚本
Oracle数据库安全策略
Oracle数据库的空间管理技巧
Oracle数据库系统使用经验六则
ORACLE数据库应用开发常见问题及排除
Oracle系统表外键的更名
Oracle约束管理脚本
如何确定Oracle数据库表重复的记录
Oracle数据库索引的维护

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


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-10-31   浏览: 200 ::
收藏到网摘: 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 过程已成功完成。

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