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

1voto

Stephen Nortje Punkte 11

Ich habe diesen Fehler aus einem ganz anderen Grund erlebt. Ich habe MySQL Workbench 6.3 verwendet, um mein Datenmodell zu erstellen (tolles Werkzeug). Mir ist aufgefallen, dass dieser Fehler auch auftritt, wenn die Spaltenreihenfolge in der Fremdschlüssel-Definition nicht mit der Tabellenspaltenfolge übereinstimmt.

Es hat mich etwa vier Stunden gekostet, alles andere zu versuchen, aber das zu überprüfen.

Jetzt funktioniert alles gut und ich kann zurück zum Codieren. :-)

1voto

Mahdi Sahib Punkte 120

Beim Versuch, einen Fremdschlüssel zu erstellen, wenn Sie Laravel Migration verwenden, wie in diesem Beispiel:

Benutzertabelle

public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name');
        $table->TinyInteger('color_id')->unsigned();
        $table->foreign('color_id')->references('id')->on('colors');
        $table->timestamps();
    });
}

Farbentabelle

public function up()
{
    Schema::create('flights', function (Blueprint $table) {
        $table->increments('id');
        $table->string('color');
        $table->timestamps();
    });
}

Manchmal haben Eigenschaften nicht funktioniert:

[PDOException]
SQLSTATE[HY000]: Allgemeiner Fehler: 1215 Kann Fremdschlüsselbeschränkung nicht hinzufügen

Dieser Fehler ist aufgetreten, weil der Fremdschlüssel (Typ) in der [Benutzertabelle] sich vom Primärschlüssel (Typ) in der [Farbentabelle] unterscheidet.

Um dieses Problem zu lösen, sollten Sie den Primärschlüssel in der [Farbentabelle] ändern:

$table->tinyIncrements('id');


Wenn Sie den Primärschlüssel verwenden, $table->Increments('id');, sollten Sie Integer als Fremdschlüssel verwenden:

$table->unsignedInteger('fk_id');
$table->foreign('fk_id')->references('id')->on('table_name');

Wenn Sie den Primärschlüssel $table->tinyIncrements('id'); verwenden, sollten Sie unsignedTinyInteger als Fremdschlüssel verwenden:

$table->unsignedTinyInteger('fk_id');
$table->foreign('fk_id')->references('id')->on('table_name');

Wenn Sie den Primärschlüssel $table->smallIncrements('id'); verwenden, sollten Sie unsignedSmallInteger als Fremdschlüssel verwenden:

$table->unsignedSmallInteger('fk_id');
$table->foreign('fk_id')->references('id')->on('table_name');

Wenn Sie den Primärschlüssel $table->mediumIncrements('id'); verwenden, sollten Sie unsignedMediumInteger als Fremdschlüssel verwenden:

$table->unsignedMediumInteger('fk_id');
$table->foreign('fk_id')->references('id')->on('table_name');

1voto

Chris Neve Punkte 1890

Wooo, ich habe es gerade verstanden! Es war eine Mischung aus vielen bereits geposteten Antworten (InnoDB, unsigned, usw.).

Eine Sache, die ich hier jedoch nicht gesehen habe ist: Wenn dein Fremdschlüssel auf einen Primärschlüssel zeigt, stellen Sie sicher, dass die Quellspalte einen sinnvollen Wert hat. Zum Beispiel, wenn der Primärschlüssel ein mediumint(8) ist, stellen Sie sicher, dass die Quellspalte auch ein mediumint(8) enthält. Das war ein Teil des Problems für mich.

1voto

nmgeek Punkte 1940

Wenn dieser Fehler auftritt, weil die referenzierte Tabelle den MyISAM-Engine verwendet, bietet diese Antwort eine schnelle Möglichkeit, Ihre Datenbank so zu konvertieren, dass alle Django-Modelltabellen InnoDB verwenden: Konvertierung einer vorhandenen MyISAM-Datenbank in InnoDB mit Django

Es handelt sich um ein Django-Verwaltungsbefehl namens convert_to_innodb.

0voto

noowie Punkte 39

Sowie alle bisherigen Ratschläge zur Sicherstellung, dass Felder identisch definiert sind, und Tabellentypen auch die gleiche Kollation haben, stellen Sie sicher, dass Sie nicht den Anfängerfehler machen, Felder zu verknüpfen, wenn Daten im Kind-Feld noch nicht im Eltern-Feld sind. Wenn Sie Daten haben, die im Kind-Feld sind und noch nicht im Eltern-Feld eingegeben wurden, wird dies diesen Fehler verursachen. Es ist schade, dass die Fehlermeldung nicht etwas hilfreicher ist.

Wenn Sie unsicher sind, sichern Sie dann die Tabelle mit dem Fremdschlüssel, löschen Sie alle Daten und versuchen Sie dann den Fremdschlüssel zu erstellen. Wenn es erfolgreich ist, wissen Sie, was zu tun ist!

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