391 Stimmen

MySQL Fehler 1215: Kann keinen Fremdschlüssel erzwingen

Ich versuche, mein neues Schema auf meinen Datenbankserver vorwärts zu entwerfen, aber ich verstehe nicht, warum ich diesen Fehler bekomme.

Ich habe versucht, hier nach der Antwort zu suchen, aber alles, was ich gefunden habe, sagte entweder, die Datenbank-Engine auf InnoDB zu setzen oder sicherzustellen, dass die Schlüssel, die ich als Fremdschlüssel verwenden möchte, Primärschlüssel in ihren eigenen Tabellen sind. Ich habe beide Dinge getan, wenn ich mich nicht irre. Was kann ich noch tun?

SQL-Skript auf Server ausführen

FEHLER: Fehler 1215: Fremdschlüssel-Einschränkung kann nicht hinzugefügt werden

-- -----------------------------------------------------
-- Tabelle `Alternative_Pathways`.`Clients_has_Staff`
-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients_has_Staff` (
  `Clients_Case_Number` INT NOT NULL ,
  `Staff_Emp_ID` INT NOT NULL ,
  PRIMARY KEY (`Clients_Case_Number`, `Staff_Emp_ID`) ,
  INDEX `fk_Clients_has_Staff_Staff1_idx` (`Staff_Emp_ID` ASC) ,
  INDEX `fk_Clients_has_Staff_Clients_idx` (`Clients_Case_Number` ASC) ,
  CONSTRAINT `fk_Clients_has_Staff_Clients`
    FOREIGN KEY (`Clients_Case_Number` )
    REFERENCES `Alternative_Pathways`.`Clients` (`Case_Number` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Clients_has_Staff_Staff1`
    FOREIGN KEY (`Staff_Emp_ID` )
    REFERENCES `Alternative_Pathways`.`Staff` (`Emp_ID` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB

SQL-Skriptausführung beendet: Anweisungen: 7 erfolgreich, 1 fehlgeschlagen

Hier ist das SQL für die Elterntabellen.

CREATE TABLE IF NOT EXISTS `Alternative_Pathways`.`Clients` (
  `Case_Number` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  `Address` CHAR(50) NULL ,
  `Phone_Number` INT(10) NULL ,
  PRIMARY KEY (`Case_Number`) )
ENGINE = InnoDB

CREATE TABLE IF NOT EXISTS `Alternative_Pathways`.`Staff` (
  `Emp_ID` INT NOT NULL ,
  `First_Name` CHAR(10) NULL ,
  `Middle_Name` CHAR(10) NULL ,
  `Last_Name` CHAR(10) NULL ,
  PRIMARY KEY (`Emp_ID`) )
ENGINE = InnoDB

693voto

Ike Walker Punkte 62083

Ich vermute, dass Clients.Case_Number und/oder Staff.Emp_ID nicht genau denselben Datentyp wie Clients_has_Staff.Clients_Case_Number und Clients_has_Staff.Staff_Emp_ID haben.

Vielleicht sind die Spalten in den übergeordneten Tabellen INT UNSIGNED?

Sie müssen in beiden Tabellen genau denselben Datentyp haben.

296voto

Explosion Pills Punkte 182627

Gründe, warum Sie einen Fremdschlüssel-Einschränkungsfehler erhalten können:

  1. Sie verwenden nicht InnoDB als Engine für alle Tabellen.
  2. Sie versuchen, einen nicht vorhandenen Schlüssel in der Zieltabelle zu referenzieren. Stellen Sie sicher, dass es ein Schlüssel in der anderen Tabelle ist (es kann ein Primär- oder Unique-Key sein oder einfach ein Schlüssel).
  3. Die Typen der Spalten sind nicht gleich (eine Ausnahme ist, dass die Spalte in der referenzierenden Tabelle auch null sein kann, auch wenn sie in der referenzierten Tabelle nicht null sein darf).
  4. Wenn der Primärschlüssel oder der Fremdschlüssel ein Varchar ist, stellen Sie sicher, dass die Kollation für beide gleich ist.
  5. Einer der Gründe kann auch sein, dass die Spalte, die Sie für ON DELETE SET NULL verwenden, nicht auf null festgelegt ist. Stellen Sie also sicher, dass die Spalte standardmäßig null ist.

Überprüfen Sie diese.

105voto

arvind Punkte 1090

Für andere kann derselbe Fehler nicht immer auf eine Spaltenart-Fehler zurückzuführen sein. Weitere Informationen zu einem MySQL-Fremdschlüsselfehler finden Sie durch Ausführen des Befehls

SHOW ENGINE INNODB STATUS;

Sie finden möglicherweise einen Fehler in der Nähe der Spitze der Drucknachricht. So etwas wie

Kann keinen Index in der referenzierten Tabelle finden, in der die referenzierten Spalten als erste Spalten erscheinen, oder die Spaltentypen in der Tabelle und der referenzierten Tabelle stimmen für die Einschränkung nicht überein.

14voto

Domi Punkte 18235

Fehler 1215 ist ein ärgerlicher. Die Antwort von Explosion Pill deckt die Grundlagen ab. Sie möchten sicherstellen, von dort aus anzufangen. Es gibt jedoch noch viel mehr subtile Fälle, auf die Sie achten sollten:

Zum Beispiel, wenn Sie versuchen, PRIMARY KEYs von verschiedenen Tabellen zu verknüpfen, stellen Sie sicher, dass Sie geeignete ON UPDATE und ON DELETE Optionen angeben. Zum Beispiel:

...
PRIMARY KEY (`id`),
FOREIGN KEY (`id`) REFERENCES `t` (`other_id`) ON DELETE SET NULL
....

funktioniert nicht, weil PRIMARY KEYs (wie id) nicht NULL sein können.

Ich bin sicher, es gibt noch mehr ähnlich subtile Probleme beim Hinzufügen solcher Einschränkungen, deshalb sollten Sie bei Auftreten von Einschränkungsfehlern immer sicherstellen, dass die Einschränkungen und ihre Auswirkungen in Ihrem aktuellen Kontext sinnvoll sind. Viel Glück mit Ihrem Fehler 1215!

11voto

Carlos Laspina Punkte 2013

Überprüfen Sie die Sortierung der Tabelle. Mit SHOW TABLE STATUS können Sie Informationen über die Tabellen, einschließlich der Sortierung, überprüfen.

Beide Tabellen müssen die gleiche Sortierung haben.

Es ist mir schon passiert.

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