Lors de la création d'une contrainte de clé étrangère, MySQL requiert un index utilisable à la fois sur la table de référence et également sur la table référencée. L'index sur la table de référence est créé automatiquement s'il n'en existe pas, mais celui sur la table référencée doit être créé manuellement (Source ). Le vôtre semble manquer.
Scénario de test :
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)
Mais si nous ajoutons un index sur 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)
Ce n'est souvent pas un problème dans la plupart des situations, car le champ référencé est souvent la clé primaire de la table référencée et la clé primaire est indexée automatiquement.