oracle - 使用主键创建视图

And*_*uta 3 oracle ddl oracle10g

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

create or replace view ABC(A, B, C, CONSTRAINT A_PK PRIMARY KEY (A)) ....
Run Code Online (Sandbox Code Playgroud)

ORA-00922: missing or invalid option指着"主键"一词.问题是,是Oracle还是Oracle文档存在问题?

Ben*_*Ben 10

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

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

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

创建视图约束有很多限制,因为它依赖于下表,它并不像@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>
Run Code Online (Sandbox Code Playgroud)

文档:

查看约束

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

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

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

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

RELY和NORELY参数是可选的.视图约束(因为它们是非强制的)通常使用RELY参数指定,以使它们更有用.RELY或NORELY关键字必须位于DISABLE关键字之前.有关更多信息,请参阅"RELY子句".

由于视图约束不直接强制执行,因此您无法指定INITIALLY DEFERRED或DEFERRABLE.

您不能指定references_clause的using_index_clause,exceptions_clause子句或ON DELETE子句.

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