Es gibt einige Dinge, die Errno 150 verursachen können. Für Leute, die dieses Thema suchen, ist hier eine meiner Meinung nach nahezu vollständige Liste (Quelle Ursachen von Errno 150 ):
Für errno 150 oder errno 121, indem Sie einfach SHOW ENGINE INNODB STATUS eingeben, gibt es einen Abschnitt namens "LATEST FOREIGN KEY ERROR". Darunter erhalten Sie eine sehr hilfreiche Fehlermeldung, die Ihnen in der Regel sofort mitteilt, worum es geht. Sie benötigen SUPER-Berechtigungen, um es auszuführen. Wenn Sie diese nicht haben, müssen Sie nur die folgenden Szenarien testen.
1) Datentypen stimmen nicht überein: Die Spaltentypen müssen identisch sein
2) Übergeordnete Spalten nicht indiziert (oder in falscher Reihenfolge indiziert)
3) Spaltenkollatierungen stimmen nicht überein
4) Verwenden von SET NULL für eine NOT NULL-Spalte
5) Tabellenkollatierungen stimmen nicht überein: Selbst wenn die Spaltenkollatierungen übereinstimmen, kann dies bei einigen MySQL-Versionen ein Problem sein.
6) Die übergeordnete Spalte ist in der übergeordneten Tabelle nicht vorhanden. Überprüfen Sie die Rechtschreibung (und möglicherweise ein Leerzeichen am Anfang oder Ende der Spalte).
7) Einer der Indizes für eine der Spalten ist unvollständig oder die Spalte ist zu lang für einen vollständigen Index. Beachten Sie, dass MySQL (sofern Sie es nicht optimieren) eine maximale Schlüssellänge für eine Spalte von 767 Byte hat (dies entspricht einer varchar (255) UTF-Spalte).
Falls Sie eine Errno 121 erhalten, gibt es einige Ursachen:
1) Der von Ihnen gewählte Einschränkungsname ist bereits vergeben
2) Auf einigen Systemen, wenn bei Ihren Anweisungs- und Tabellennamen ein Fallunterschied besteht. Dies kann Sie beißen, wenn Sie von einem Server zu einem anderen wechseln, für den unterschiedliche Regeln für die Fallbearbeitung gelten.