web-dev-qa-db-ja.com

Oracle-一意の制約にインデックスを使用すると、どうなるでしょうか。

Druid を使用してOracle用のSQLスクリプトを生成すると、バージョン3.10と3.13の違いがわかり、何が起こっているのかを理解したいと思います。

Druid 3.10によって生成されたSQL:

CREATE TABLE ATTRIBUTE_VALUE_LABEL
  (
    ID         NUMBER(18),
    ATTRVALID  NUMBER(18)       not null,
    LANGUAGE   NVARCHAR2(2)     not null,
    NAME       NVARCHAR2(250)   not null,
    CREATED    DATE             default SYSDATE,
    MODIFIED   DATE,
    CONSTRAINT PK_ATTRIBUTE_VALUE_LABEL primary key(ID) USING INDEX TABLESPACE &&TSINDEX,
    CONSTRAINT XA_ATTRIBUTE_VALUE_LABEL_2 unique(ATTRVALID,LANGUAGE) USING INDEX TABLESPACE &&TSINDEX,
    CONSTRAINT FK_ATTRIBUTE_VALUE_LABEL_1 foreign key(ATTRVALID) references ATTRIBUTE_VALUE(ID) on delete CASCADE
  );

Druid 3.13によって生成されたSQL:

CREATE TABLE ATTRIBUTE_VALUE_LABEL
  (
    ID         NUMBER(18),
    ATTRVALID  NUMBER(18)       not null,
    LANGUAGE   NVARCHAR2(2)     not null,
    NAME       NVARCHAR2(250)   not null,
    CREATED    DATE             default SYSDATE,
    MODIFIED   DATE,
    CONSTRAINT PK_ATTRIBUTE_VALUE_LABEL primary key(ID) USING INDEX TABLESPACE &&TSINDEX,
    CONSTRAINT XA_ATTRIBUTE_VALUE_LABEL_2 unique(ATTRVALID,LANGUAGE),
    CONSTRAINT FK_ATTRIBUTE_VALUE_LABEL_1 foreign key(ATTRVALID) references ATTRIBUTE_VALUE(ID) on delete CASCADE
  );

ご覧のとおり、唯一の違いは、ドルイドがUNIQUE制約の後にUSING INDEX TABLESPACE &&TSINDEXを生成しないことです。

DruidがUNIQUE制約でこのUSING INDEXを生成しなくなったのには理由があるのではないかと思います(すでにUSING INDEXが存在するという事実と関係がある可能性がありますPRIMARY制約)ですが、その理由を理解したいと思います。

それでは2つの質問があります:

  1. これにより、Oracleでエラーが発生する可能性がありますか?
  2. これは、一意の制約によって使用されるインデックスの何かを変更しますか?適切な表スペースにありませんか?
1
vdubus

USING INDEX句を省略しても、テーブルが作成されるのと同じテーブルスペースに、制約と同じ名前でインデックスが自動的に作成されます。これはエラーを引き起こしません。

http://docs.Oracle.com/database/121/SQLRF/clauses002.htm#SQLRF52225

  • Schema.indexを指定すると、Oracleは指定されたインデックスを使用して制約を適用しようとします。 Oracleがインデックスを見つけられない場合、またはインデックスを使用して制約を適用できない場合、Oracle
    はエラーを返します。

  • Create_index_statementを指定すると、Oracleはインデックスを作成し、それを使用して制約を適用しようとします。 Oracleの場合
    インデックスを作成できないか、インデックスを使用して
    制約の場合、Oracleはエラーを返します。

  • 既存のインデックスを指定せず、新しいインデックスを作成しない場合、Oracleはインデックスを作成します。この場合:

    • インデックスは、制約と同じ名前を受け取ります。

    • テーブルがパーティション化されている場合は、一意または主キーの制約に対してローカルまたはグローバルにパーティション化されたインデックスを指定できます。

3
Balazs Papp