首页 | 资讯动态 | linux基础 | 系统管理 | 网络管理 | 编程开发 | linux数据库 | 服务器技术 | linux相关 | linux认证 | 嵌入式 | 下载中心 | 专题 | linux招聘 | HR | 镜像
OKLinux中文技术站
·设为首页
·加入收藏
·联系我们
系统管理: 中文环境 系统管理 桌面应用 内核技术 | Linux基础: 基础入门 安装配置 常用命令 经验技巧 软件应用 | Linux数据库: Mysql Postgre Oracle DB2 Sybase other
网络管理: 网络安全 网络应用 Linux服务器 环境配置 黑客安全 | 编程开发: PHP CC++ Python Perl Shell 嵌入式开发 java jsp | PHP技术: PHP基础 PHP技巧 PHP应用 PHP文摘
搜索中心 Linux招聘 Linux专题 Apache | Linux相关: 硬件相关 Linux解决方案 Linux认证 企业应用 其它Unix | 相关下载: 资料下载 参考手册 开发工具 服务器类 软路由 其它
 技术搜索:
会员中心 注册会员 高级搜索  
  → 当前位置:首页>linux数据库>oracle>正文

解析:物化视图刷新中出现的“约束冲突”

http://www.oklinux.cn  2007-11-12  ccidnet 26896  会员收藏  游客收藏  【 】 
您查看的文章来源于http://www.oklinux.cn

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

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

以下是一个简单的示例:

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 794
ORA-06512: 在"SYS.DBMS_SNAPSHOT", line 851
ORA-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 过程已成功完成。

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


上一篇:解析:JOB的Interval输入参数过长的问题   下一篇:PHP 4.4.0发布 修复导致内存崩溃问题

收藏于收藏夹】 【评论】 【推荐】 【打印】 【关闭
相关文档
·解析:JOB的Interval输入参数过长的问题
·解析:基于Oracle高性能动态SQL程序开发
·轻松掌握Oracle Peeking 绑定变量的控制
·细化解析:怎样恢复一个丢失的 数据文件
·解析:用dbv和RMAN检查数据文件中的坏块
·细化解析:怎样处理Oracle数据库中的坏块
·解析:如何正确的更改监听器日志文件名称
·怎样使用SQL Server数据库的查询累计值
·使用Flashback Query 恢复误删除的数据
·实例解析:怎样获得当前 数据库的SCN值
·怎样使用ERRORSTACK进行错误跟踪及诊断
·细化解析:时间再次停止运行的解决方法
·解析:怎样在Oracle 9i中正确的转换时区
·教你轻松掌握如何把数据导入不同的表空间
·实例解析:sqlldr加载数据到不同表的问题
·教你快速掌握Oracle 9i数据库的移动过程
发表评论
密码: 匿名评论
评论内容:

(不超过250字,需审核后才会公布,请自觉遵守互联网相关政策法规)
 
  最新文档
·关于Oracle将目标数据库设为归档模式应
·Linux下OCI基础:配置Instant Client连
·Oracle中被锁定的解决办法
·Oracle 11G 无法连接到数据库实例故障
·浅谈创建Oracle数据库连接的两种方法
·如何从Oracle技术支持获得更多
·Oracle数据库中安全知识介绍
·Oracle推出Linux服务并不成功
·Oracle专用服务器的内存结构分布原则
·如何在RAC环境下修改Oracle字符集
·Oracle过程中执行动态SQL或DDL语句
·2008年Oracle错误、备份、升级等最热门
  阅读排行
·详解远程SHELL下安装配置RedHat ES 5的
·Ubuntu上安装Oracle 10G及相关配置
·Oracle高级复制(同步复制)配置步骤详细
·如何修改遗失的MySQL的ROOT用户密码
·Redhat Linux AS4 安装Oracle 10g(包括
·Linux下OCI基础:配置Instant Client连
·解决启动数据库时发生的ORA-12528错误
·在 Oracle Enterprise Linux 上升级到
·Oracle 10g表空间创建的完整步骤
·centos 5.0中成功安装Oracle10g (1020
·如何在RAC环境下修改Oracle字符集
·Oracle数据库导入导出方法的个人总结
·巧用Oracle执行计划机制提高查询性能
·Oracle 10g 在AIX 5.3上安装过程笔记
·Linux真机环境Oracle 10gR2 RAC 安装完
网摘收藏: