質問: oracle - 主キーを持つビューを作成する この質問は重複していますが、それを明確にする必要があります。 Oracleのマニュアルは、具体的には可能なと述べています `CREATE VIEW` 句で主キーを指定してください(11gドキュメントは同じ概念を持ちます)。しかし、私はこれを次のようにしようとします: [``` create or replace view ABC(A, B, C, CONSTRAINT A_PK PRIMARY KEY (A)) .... ``` ORA-00922:「主キー」という語句を指しているというオプションがありません。問題は、Oracleドキュメントの問題なのですか、それとも何か問題がありますか?](https://docs.oracle.com/cd/B19306_01/server.102/b14200/statements_8004.htm#sthref8266)
回答: 簡単な答えはあなたの構文が間違っているということです。 `DISABLE` を指定する必要があります。 `NOVALIDATE` disables validation of the primary key, in a view this is the default and so is included automatically; but it's a lot clearer if you use it, as, in a lovely double negative, `disable novalidate` disables the ability to disable the primary key. `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句を使用します。 > > > > オブジェクトの列の属性に対してビューの制約を定義することはできません。 > >