eygle.com   eygle.com
eygle.com eygle
eygle.com  
 

« 基于主键和唯一约束的显示索引控制 | Blog首页 | 2月份的最后一天 »

Oracle9i基于视图(view)的约束声名

从Oracle9i开始,Oracle允许对于视图(view)进行主键、唯一键、外键约束的声名。NOT NULL约束可以从基表继承,所以不允许显示声明。
由于视图约束仅仅是声明而已,所以其状态只能是DISABLE NOVALIDATE。

以下是一个简单范例说明:

SQL> CREATE VIEW d10_emp
  2  ( empno, ename, job,deptno,
  3  CONSTRAINT pk_d10
  4  PRIMARY KEY (ename)
  5  RELY DISABLE NOVALIDATE
  6  ) AS
  7  SELECT empno, ename, job ,deptno
  8  FROM emp
  9  WHERE deptno = 10; 
View created.
SQL> select * from d10_emp;
     EMPNO ENAME      JOB           DEPTNO
---------- ---------- --------- ----------
      7782 CLARK      MANAGER           10
      7839 KING       PRESIDENT         10
      7934 MILLER     CLERK             10
SQL> select CONSTRAINT_NAME,TABLE_NAME,CONSTRAINT_TYPE from user_constraints
  2  where table_name='D10_EMP';
CONSTRAINT_NAME                TABLE_NAME                     C
------------------------------ ------------------------------ -
PK_D10                         D10_EMP                        P 

由于此约束仅仅为"约束声明",所以不具有实际约束力:

SQL> insert into d10_emp values(7777,'EYGLE','MANAGER',10);
1 row created.
SQL> insert into d10_emp values(8888,'EYGLE','MANAGER',10);
1 row created.
SQL> select * from d10_emp;
     EMPNO ENAME      JOB           DEPTNO
---------- ---------- --------- ----------
      7782 CLARK      MANAGER           10
      7839 KING       PRESIDENT         10
      7934 MILLER     CLERK             10
      7777 EYGLE      MANAGER           10
      8888 EYGLE      MANAGER           10 

历史上的今天...
    >> 2013-02-27文章:
    >> 2009-02-27文章:
    >> 2008-02-27文章:
    >> 2007-02-27文章:
           结束假期 回到北京

无觅

By eygle on 2006-02-27 17:27 | Comments (6) | SQL.PLSQL | 696 |

6 Comments

rely子句仅在query rewrite时会有用

恩,RELY和NORELY在这里都是允许的。

那它要这个约束就是没有实际的意义吗?

要这个约束干什么呢?

嘿嘿,这个问题问的好:)

其实这是一个针对Data Warehouse的一个增强.
在Data Warehouse中,立方的识别需要通过数据字典中的引用一致性约束,此前基于事实表和维表通过View创建的Cube是不能被正确识别的.

这就是这个增强的意义所在.

学到知识了^_^


CopyRight © 2004~2020 云和恩墨,成就未来!, All rights reserved.
数据恢复·紧急救援·性能优化 云和恩墨 24x7 热线电话:400-600-8755 业务咨询:010-59007017-7040 or 7037 业务合作: marketing@enmotech.com