2 Stimmen

Mysql, innodb - Kann den Fremdschlüssel nicht erstellen

Bei Verwendung des Standard-Motors (MyIsam) kann ich mit dieser Syntax einen Fremdschlüssel erstellen:

alter table `codes` add constraint foreign key(`associated_code_id`) references ask_codes(code_id)  on update cascade on delete cascade;

Wenn ich jedoch die Tabelle mit INNODB erstelle, kann ich den Fremdschlüssel nicht mehr erstellen (mysql gibt mir ERROR 1005 (HY000): Can't create table 'my_table.#sql-3311_16115' (errno: 150) ).

Ist das ein Syntaxproblem? Danke für die Hilfe,

7voto

Alireza Punkte 5598

Ihr Problem ist, dass beide Spalten nicht denselben Typ haben - sie stimmen nicht genau überein:

Wenn Sie eine Tabelle neu erstellen, die gelöscht wurde, muss sie eine Definition haben, die den darauf verweisenden Fremdschlüsselbedingungen entspricht. Sie muss die richtigen Spaltennamen und -typen haben und muss Indizes auf die referenzierten Schlüssel haben, wie zuvor erwähnt. Wenn diese Bedingungen nicht erfüllt sind, gibt MySQL Fehlernummer 1005 zurück und verweist auf Fehler 150 in der Fehlermeldung.

1voto

aesede Punkte 5313

Ich ergänze die großartige Antwort von @phpGeek, dass auch die LÄNGE der numerischen Werte übereinstimmen muss, das bedeutet, wenn Tabelle A "id INT(11)" hat, muss Tabelle B auch "A_id INT(11)" haben.

0voto

nnichols Punkte 7884

Wenn Sie den ALTER-Befehl für die MyISAM-Tabelle ausführen, ignoriert er lautlos die FK-Beschränkung, soweit ich mich erinnere. Wenn Sie es für InnoDB ausführen, versucht es, die Beschränkung zu validieren, indem es sie auf die Tabelle anwendet. Ich glaube, dass dieser Fehler auftritt, wenn die FK-Beschränkung für eine vorhandene Zeile fehlschlägt - InnoDB-Fehlercodes

Sie könnten die folgende Abfrage ausprobieren, um zu sehen, welche Werte die Erstellung der Beschränkung blockieren -

SELECT *
FROM codes
LEFT JOIN ask_codes
    ON codes.associated_code_id = ask_codes.code_id
WHERE ask_codes.code_id IS NULL

-6voto

michel luther Punkte 279

Ich glaube, das ist einfach eine Einschränkung von InnoDB. Es unterstützt keine Fremdschlüssel. Zumindest ist das, worauf ich nach dem letzten Mal, als mich dieses Problem traf, zurückgekommen bin.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X