oracle - 使用主键创建视图

时间:2012-02-06 12:34:55

标签: oracle oracle10g ddl

这个问题在意义上是重复的,我还是要澄清一下。 Oracle文档具体says可以在CREATE VIEW子句中指定主键(11g docs具有相同的概念)。然而,当我尝试这样做时:

create or replace view ABC(A, B, C, CONSTRAINT A_PK PRIMARY KEY (A)) ....

我得到ORA-00922: missing or invalid option指向“主键”短语。问题是,是我还是Oracle文档出了问题?

2 个答案:

答案 0 :(得分:9)

简单的答案是你的语法不正确。您必须指定DISABLE

NOVALIDATE禁用主键验证,在视图中这是默认值,因此会自动包含;但是如果你使用它会更清楚,因为在一个可爱的双重否定中,disable novalidate禁用了禁用主键的能力。

rely是可选的;它指定在创建视图时是否考虑主键。 rely的反义词是norely

创建视图约束有很多限制,因为它依赖于下表,它并不像@RC已经注意到的那样值得。但如果您只需要文档,那么请转到:

SQL> create table tmp_test ( a number(10), b varchar2(120) );

Table created.

SQL>
SQL> insert into tmp_test
  2   select level, 'b'
  3     from dual
  4  connect by level <= 20
  5          ;

20 rows created.

SQL>  commit ;

Commit complete.

SQL>
SQL> alter table tmp_test
  2    add constraint tmp_test_pk
  3        primary key (a)
  4        using index;

Table altered.

SQL>
SQL> create or replace view v_tmp_test (a, b
  2     , constraint v_tmp_test_pk primary key (a) rely disable novalidate) as
  3   select a, b
  4     from tmp_test
  5          ;

View created.

SQL>

来自documentation

  

查看约束

     

Oracle不强制执行视图约束。但是,对视图的操作   受基础上定义的完整性约束   基表。这意味着您可以对视图强制实施约束   通过对基表的约束。

     

关于视图约束的注释视图约束是表的子集   限制并受以下限制:

     

您只能指定唯一,主键和外键约束   在观点上。但是,您可以使用WITH CHECK OPTION定义视图   子句,相当于为。指定检查约束   图。

     

仅在DISABLE NOVALIDATE模式下支持视图约束。您   无法指定任何其他模式。您必须指定关键字DISABLE   当您声明视图约束时。您无需指定NOVALIDATE   显式,因为它是默认值。

     

RELY和NORELY参数是可选的。查看约束,因为   它们是非强制的,通常用RELY参数指定   让它们更有用。 RELY或NORELY关键字必须位于   DISABLE关键字。有关更多信息,请参阅“RELY条款”。

     

由于未直接强制执行视图约束,因此无法指定   最初是推迟的或可以推迟的。

     

您无法指定using_index_clause,exceptions_clause   子句,或references_clause的ON DELETE子句。

     

您无法在对象列的属性上定义视图约束。

答案 1 :(得分:3)

您必须将约束创建为已禁用。它实际上是一种向优化器提示以影响查询计划的方法。

在基础表级别强制执行数据完整性。当您考虑它时,在视图级别强制执行主键约束并不是很有意义。普通的ole视图不存储数据,它只是其他表提供的数据的“视图”。如果主键约束仅放置在某个基础表的视图上,并且该表本身不强制执行约束,那么视图如何处理某人直接使用破坏其约束的数据更新表的情况? (即表格不知道通过视图对其施加了什么约束)