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

0voto

ajon Punkte 7370

Dies ist eine subtile Version dessen, was bereits gesagt wurde, aber in meinem Fall hatte ich 2 Datenbanken (foo und bar). Ich habe zuerst foo erstellt und habe nicht bemerkt, dass es einen Fremdschlüssel in bar.baz referenziert (der noch nicht erstellt wurde). Als ich versuchte, bar.baz zu erstellen (ohne Fremdschlüssel), erhielt ich immer diesen Fehler. Nachdem ich eine Weile gesucht hatte, fand ich den Fremdschlüssel in foo.

Also, um es kurz zu machen, wenn Sie diesen Fehler erhalten, haben Sie möglicherweise einen bereits vorhandenen Fremdschlüssel zur Tabelle, die erstellt wird.

0voto

Dima Dz Punkte 492

Ein weiterer Ursprung dieses Fehlers liegt darin, dass Sie zwei oder mehr Tabellennamen haben, die die gleichen Fremdschlüsselnamen haben.

Dies passiert manchmal bei Personen, die Modellierungs- und Designsoftware wie MySQL Workbench verwenden und später das Skript aus dem Design generieren.

0voto

Olivier Faucheux Punkte 2372

Achte auch auf die Verwendung von Backticks. In einem Skript hatte ich die folgende Anweisung:

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user(id)`;

aber die Backticks am Ende waren falsch. Es hätte stattdessen sein sollen:

ALTER TABLE service ADD FOREIGN KEY (create_by) REFERENCES `system_user`(`id`);

Leider gibt MySQL keine Details zu diesem Fehler...

0voto

Arya Punkte 487

Für mich trat der Fehler 1215 auf, als ich eine von mysqldump erstellte Dumpdatei importierte, die die Tabellen alphabetisch erstellt, was in meinem Fall dazu führte, dass Fremdschlüssel auf Tabellen verwiesen, die später in der Datei erstellt wurden. (Ein Dank geht an diesen Blog-Beitrag, der es herausgefunden hat: MySQL Fehlercode 1215: "Kann Fremdschlüssel-Einschränkung nicht hinzufügen")

Da mysqldump die Tabellen alphabetisch ordnet und ich die Namen der Tabellen nicht ändern wollte, folgte ich den Anweisungen in der Antwort von JeremyWeir auf dieser Seite, die besagt, set FOREIGN_KEY_CHECKS = 0; am Anfang der Dumpdatei und SET FOREIGN_KEY_CHECKS = 1; am Ende der Dumpdatei einzufügen.

Diese Lösung hat bei mir funktioniert.

0voto

Philippe Gerber Punkte 16773

Für mich war das Problem, dass ich versucht habe, auf die zweite Spalte in einem zusammengesetzten Primärschlüssel zu verweisen (z. B. ['Spalte1', 'Spalte2']).

In der Fehlermeldung wird erwähnt, dass die Spalte zuerst stehen muss:

Kann keinen Index in der referenzierten Tabelle finden, in der die referenzierten Spalten als erste Spalten erscheinen [...]

Nachdem ich einen zusätzlichen Index auf der zweiten Spalte hinzugefügt habe (Spalte2 im Beispiel), konnte ich den Fremdschlüssel hinzufügen.

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