2016-06-29 3 views
0

コンポジットキーの列の1つを外部キーとして使用できるかどうかを確認しようとしていました。そして私は奇妙な結果を得ました。コンポジットキーの列の1つを外部キーとして使用

CREATE TABLE TESTPARENT(
    PK1 INT, 
    PK2 INT, 
    PRIMARY KEY(PK1,PK2) 
); 

Query OK, 0 rows affected (0.01 sec) 


CREATE TABLE TESTCHILD1(
    FK1 INT, 
    FOREIGN KEY (FK1) REFERENCES TESTPARENT(PK1) 
); 

Query OK, 0 rows affected (0.01 sec) 


CREATE TABLE TESTCHILD2(
    FK2 INT, 
    FOREIGN KEY (FK2) REFERENCES TESTPARENT(PK2) 
); 

ERROR 1005 (HY000): Can't create table 'test.TESTCHILD2' (errno: 150) 

MySQLでは、主キーの最初の列のみを参照する外部キーを作成できますが、2番目の列は作成しません。これは奇妙ですか?または私は愚かなのですか?

+0

[documentation](https://dev.mysql.com/doc/refman/5.6/en/create-table-foreign-keys.html)に従う: "InnoDBは外部キーに任意のインデックスを参照させるただし、参照先の表には、参照先の列が同じ順序で*最初の列としてリストされている索引が必要です。 PKは、FK1のそのようなインデックスです。 –

+0

@FredericoFalcao私はPK1とPK2を同じ方法で宣言しましたが、なぜPK1はPK2ではなくユニークなのですか? – Jasir

答えて

1

: ですから、PK2にインデックスを追加する必要が

InnoDBは、列のすべてのインデックス列またはグループを参照する外部キーを許可します。ただし、参照先の表には、参照先の列が同じ順序で最初の列としてリストされる索引が必要です。

NDBでは、外部キーとして参照される任意の列 に明示的な一意のキー(または主キー)が必要です。

したがって、innodbを使用すると、インデックスの一番左のフィールドではないフィールドに外部キーを作成することはできません。

なぜなら、マルチカラムインデックスでは、最も左ではないフィールドに基づいて値をルックアップできないため、インデックスを使用して外部キーチェックの値をすばやく検索することができないためです。

MySQLのインデックスのこの動作はmulti-column indexes上のMySQLのマニュアルに記載されています

列がインデックスの左端の接頭辞を形成しない場合、MySQLは、ルックアップを実行するためにインデックスを使用することはできません。

1

FKリレーションシップでは、子テーブルと親テーブルの列にインデックスを付ける必要があります。 MySQLは2番目の列(自分の場合はPK2)でインデックスを使用できません。 foreign keys indicates上のMySQLのドキュメントとして

alter table TESTPARENT add key (PK2); 
+0

PK1についてはどうでしょうか。インデックスは最初の列のみに自動的に追加されますか? – Jasir

+1

PRIMARY KEY(PK1、PK2)は2つの列に基づいていますが、PK2はPK1でのみインデックスによって使用されます。最初の列としてのPK1は、別々に索引で使用できます。 –

関連する問題