创建外键约束时,MySQL在引用表和被引用表上都需要一个可用的索引。如果不存在引用表上的索引,则会自动创建索引,但需要手动创建引用表上的索引(Source)。您的似乎丢失了。
测试用例:
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: 0CREATE 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)
在大多数情况下,这通常不是问题,因为被引用字段通常是被引用表的主键,并且主键会自动索引。



