2

bar名前付きインデックスに裏打ちされた名前付き外部キー制約を持つテーブルを作成したいと考えています。create table DDL ステートメントのインライン定義でそれを行いたいと思います。Oracle 19 SQL 言語リファレンスを見ると、Oracle はインラインでの実行をサポートする必要があるようです。

次のステートメントを実行すると...

create table foo (
    id number not null primary key
);

create table bar (
    id     number not null primary key,
    nick   varchar2(16) not null constraint foo_nick_ck unique using index,
    foo_id number not null constraint foo_fk references foo using index
);

オラクルは、最終行の の[42000][907] ORA-00907: missing right parenthesis直前の位置をポイントして応答します。using index削除するusing indexと機能します(ただし、もちろんインデックスは作成されません)。バッキング インデックスをインラインで作成する場所の例として列を保持しましたnickが、外部キー制約の代わりに一意の制約を使用します。

別の DDL ステートメントでバッキング インデックスを作成することが回避策であることは承知していますが、インラインで整然としたものにしたいと考えています。

4

2 に答える 2

3

別の DDL ステートメントでバッキング インデックスを作成することが回避策であることは承知していますが、インラインで整然としたものにしたいと考えています。

残念ながら、インラインでインデックスを作成するための構文は存在しません。

USING INDEX 句はシンタックス シュガーです。Oracle は、その句(*)を含めるかどうかに関係なく、主キーおよび一意の制約を強制するインデックスを作成します。これは、Oracle のユニーク制約の実装に索引が必要だからです。しかし、インデックスが外部キーを強制する必要はありません。それが望ましいだけです。


(*)制約された列に Oracle が使用できる既存のインデックスがない場合。

于 2020-02-27T15:46:54.330 に答える
2

Oracleのドキュメントに従って:

一意または主キー制約を有効にする場合にのみ、using_index_clause を指定できます。

NOT NULL外部キー、またはチェック制約に対してこの句を指定することはできません。

于 2020-02-27T15:47:36.150 に答える