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つの質問があります:
USING INDEX
句を省略しても、テーブルが作成されるのと同じテーブルスペースに、制約と同じ名前でインデックスが自動的に作成されます。これはエラーを引き起こしません。
http://docs.Oracle.com/database/121/SQLRF/clauses002.htm#SQLRF52225
Schema.indexを指定すると、Oracleは指定されたインデックスを使用して制約を適用しようとします。 Oracleがインデックスを見つけられない場合、またはインデックスを使用して制約を適用できない場合、Oracle
はエラーを返します。Create_index_statementを指定すると、Oracleはインデックスを作成し、それを使用して制約を適用しようとします。 Oracleの場合
インデックスを作成できないか、インデックスを使用して
制約の場合、Oracleはエラーを返します。既存のインデックスを指定せず、新しいインデックスを作成しない場合、Oracleはインデックスを作成します。この場合:
インデックスは、制約と同じ名前を受け取ります。
テーブルがパーティション化されている場合は、一意または主キーの制約に対してローカルまたはグローバルにパーティション化されたインデックスを指定できます。