外部キー制約を作成する場合、MySQLは参照テーブルと参照テーブルの両方で使用可能なインデックスを必要とします。参照テーブルのインデックスは、存在しない場合は自動的に作成されますが、参照テーブルのインデックスは手動で作成する必要があります(ソース )。あなたのものが欠けているようです。
テストケース:
CREATE TABLE tbl_a (
id int PRIMARY KEY,
some_other_id int,
value int
) ENGINE=INNODB;
Query OK, 0 rows affected (0.10 sec)
CREATE TABLE tbl_b (
id int PRIMARY KEY,
a_id int,
FOREIGN KEY (a_id) REFERENCES tbl_a (some_other_id)
) ENGINE=INNODB;
ERROR 1005 (HY000): Can't create table 'e.tbl_b' (errno: 150)
ただし、some_other_id
にインデックスを追加すると :
CREATE INDEX ix_some_id ON tbl_a (some_other_id);
Query OK, 0 rows affected (0.11 sec)
Records: 0 Duplicates: 0 Warnings: 0
CREATE TABLE tbl_b (
id int PRIMARY KEY,
a_id int,
FOREIGN KEY (a_id) REFERENCES tbl_a (some_other_id)
) ENGINE=INNODB;
Query OK, 0 rows affected (0.06 sec)
参照されるフィールドは参照されるテーブルの主キーであることが多く、主キーは自動的にインデックス付けされるため、これはほとんどの状況で問題にならないことがよくあります。