Mysql
 sql >> Datenbank >  >> RDS >> Mysql

MySQL-Fremdschlüsselfehler 1005 errno 150 Primärschlüssel als Fremdschlüssel

Beim Erstellen einer Fremdschlüsseleinschränkung benötigt MySQL einen verwendbaren Index sowohl für die referenzierende Tabelle als auch für die referenzierte Tabelle. Der Index für die referenzierende Tabelle wird automatisch erstellt, wenn keiner vorhanden ist, aber der Index für die referenzierte Tabelle muss manuell erstellt werden (Quelle ). Ihre scheint zu fehlen.

Testfall:

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)

Aber wenn wir einen Index auf some_other_id hinzufügen :

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)

Dies ist in den meisten Situationen oft kein Problem, da das referenzierte Feld oft der Primärschlüssel der referenzierten Tabelle ist und der Primärschlüssel automatisch indiziert wird.