这个问题在意义上是重复的,我还是要澄清一下。 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文档出了问题?
答案 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>
查看约束
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视图不存储数据,它只是其他表提供的数据的“视图”。如果主键约束仅放置在某个基础表的视图上,并且该表本身不强制执行约束,那么视图如何处理某人直接使用破坏其约束的数据更新表的情况? (即表格不知道通过视图对其施加了什么约束)