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

3voto

Ich hatte das gleiche Problem, und meine Lösung ist:

Vorher:

CREATE TABLE EMPRES
( NoFilm smallint NOT NULL

  PRIMARY KEY (NoFilm)

  FOREIGN KEY (NoFilm) REFERENCES cassettes

);

Lösung:

CREATE TABLE EMPRES
(NoFilm smallint NOT NULL REFERENCES cassettes,

 PRIMARY KEY (NoFilm)

);

3voto

Mozaffar Punkte 51

Dies geschieht auch, wenn die Art der Spalten nicht übereinstimmt.

Wenn beispielsweise die Spalte, auf die Sie sich beziehen, ein UNSIGNED INT ist und die beziehende Spalte INT ist, erhalten Sie diesen Fehler.

3voto

CoderBapu Punkte 51

Ich wollte nur dieses Beispiel hinzufügen, um auch den VARCHAR Fremdschlüsselbeziehung zu erwähnen. Ich habe letzte Woche damit verbracht, dies in MySQL Workbench 8.0 herauszufinden, und war schließlich in der Lage, den Fehler zu beheben.

Kurze Antwort: Das Zeichensatz und Kollation des Schemas, der Tabelle, der Spalte, der referenzierenden Tabelle, der referenzierenden Spalte und jeder anderen Tabelle, die auf die Elterntabelle verweisen, müssen übereinstimmen.

Lange Antwort: Ich hatte ein ENUM-Datentyp in meiner Tabelle. Ich habe das in VARCHAR geändert, und ich kann die Werte aus einer Referenztabelle abrufen, so dass ich die Elterntabelle nicht ändern muss, um zusätzliche Optionen hinzuzufügen. Diese Fremdschlüsselbeziehung schien unkompliziert zu sein, aber ich erhielt den Fehler 1215. Die Antwort von arvind und der folgende link schlugen die Verwendung von

SHOW ENGINE INNODB STATUS;

Von der Verwendung dieses Befehls erhielt ich die folgende ausführliche Beschreibung des Fehlers, ohne zusätzliche hilfreiche Informationen

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 nicht überein für den Constraint. Beachten Sie, dass der interne Speichertyp von ENUM und SET sich in Tabellen geändert hat, die mit >= InnoDB-4.1.12 erstellt wurden, und solche Spalten in alten Tabellen können von solchen Spalten in neuen Tabellen nicht referenziert werden. Bitte beachten Sie http://dev.mysql.com/doc/refman/8.0/en/innodb-foreign-key-constraints.html für die richtige Definition des Fremdschlüssels.

Daraufhin verwendete ich SET FOREIGN_KEY_CHECKS=0; wie von Arvind Bharadwaj und dem Link here vorgeschlagen:

Dies gab folgende Fehlermeldung:

Fehlercode: 1822. Fremdschlüssel-Constraint konnte nicht hinzugefügt werden. Fehlendes Index für den Constraint

An diesem Punkt habe ich das Schema 'rückwärts konvertiert' und konnte die Fremdschlüsselbeziehung im EER-Diagramm herstellen. Beim 'vorwärts konvertieren' erhielt ich folgenden Fehler:

Fehler 1452: Kann keine Kindzeile hinzufügen oder aktualisieren: Ein Fremdschlüssel-Constraint schlägt fehl

Als ich das EER-Diagramm in ein neues Schema 'vorwärts konvertiert' habe, wurde das SQL-Skript ohne Probleme ausgeführt. Beim Vergleich des generierten SQL aus den Konvertierungsversuchen stellte ich fest, dass der Unterschied im Zeichensatz und der Kollation lag. Die Elterntabelle, Kindtabelle und die beiden Spalten hatten utf8mb4 Zeichensatz und utf8mb4_0900_ai_ci Kollation, jedoch wurde eine andere Spalte in der Elterntabelle unter Verwendung von CHARACTER SET = utf8 , COLLATE = utf8_bin ; auf eine andere Kindtabelle referenziert.

Für das gesamte Schema habe ich den Zeichensatz und die Kollation für alle Tabellen und alle Spalten wie folgt geändert:

CHARACTER SET = utf8mb4 COLLATE = utf8mb4_general_ci;

Dies hat schließlich mein Problem mit dem Fehler 1215 gelöst.

Nebenbei bemerkt: Die Kollation utf8mb4_general_ci funktioniert in MySQL Workbench 5.0 oder höher. Die Kollation utf8mb4_0900_ai_ci funktioniert nur für MySQL Workbench 8.0 oder höher. Ich glaube, einer der Gründe, warum ich Probleme mit Zeichensatz und Kollation hatte, liegt daran, dass MySQL Workbench zwischenzeitlich auf 8.0 aktualisiert wurde. Hier ist ein Link, der mehr über diese Kollation spricht.

3voto

Arvind Bhardwaj Punkte 5154

In meinem Fall musste ich die FOREIGN KEY-Überprüfungen deaktivieren, da die Quelltabellen nicht vorhanden waren.

SET FOREIGN_KEY_CHECKS=0;

2voto

user3478348 Punkte 29

Ich hatte das gleiche Problem.

Ich habe es so gelöst:

Ich habe die folgende Zeile in der primärschlüssel: (id int(11) unsigned NOT NULL AUTO_INCREMENT) erstellt

Ich habe diese Lösung gefunden, nachdem ich versucht habe, eine Tabelle in meinem Schema-Builder zu importieren.

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