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

7voto

CodeMed Punkte 10830

In meinem Fall hatte ich eine Tabelle mit SET FOREIGN_KEY_CHECKS=0 gelöscht und danach SET FOREIGN_KEY_CHECKS=1 ausgeführt. Als ich versuchte, die Tabelle erneut zu laden, erhielt ich Fehler 1215. Das Problem war, dass es eine andere Tabelle in der Datenbank gab, die einen Fremdschlüssel zur gelöschten und neu geladenen Tabelle hatte. Ein Teil des Laden-Prozesses bestand darin, einen Datentyp für eine der Felder zu ändern, was den Fremdschlüssel aus der anderen Tabelle ungültig machte und somit Fehler 1215 auslöste. Ich habe das Problem gelöst, indem ich die andere Tabelle gelöscht und dann mit dem neuen Datentyp für das betroffene Feld neu geladen habe.

6voto

bortunac Punkte 4266

Für MySQL (InnoDB) ... erhalten Sie Definitionen für die Spalten, die Sie verknüpfen möchten:

SELECT * FROM information_schema.columns WHERE
TABLE_NAME IN ('tb_name','referenced_table_name') AND
COLUMN_NAME  IN ('col_name','referenced_col_name')\G

Vergleichen und überprüfen Sie, ob beide Spaltendefinitionen haben:

gleicher COLUMN_TYPE(Länge), gleiche SORTIERUNG

Es könnte erforderlich sein, den Fremdschlüsselmechanismus zu deaktivieren/aktivieren, aber seien Sie sich bewusst, wenn dies im Produktionskontext geschieht:

set foreign_key_checks=0;
ALTER TABLE tb_name ADD FOREIGN KEY(col_name) REFERENCES ref_table(ref_column) ON DELETE ...
set foreign_key_checks=1;

6voto

user2975399 Punkte 121

Beim Verwenden von Laravel 4, besonders mit JeffreyWays Laravel 4 Generatoren, bin ich auf ein Problem gestoßen, das als "Fehler 1215: Fremdschlüssel-Einschränkung kann nicht hinzugefügt werden" auftritt.

In Laravel 4 können Sie JeffreyWays Generatoren verwenden, um Migrationsdateien zu erstellen, um Tabellen einzeln zu erstellen, was bedeutet, dass jede Migrationsdatei eine Tabelle erstellt.

Sie müssen sich darüber im Klaren sein, dass jede Migrationsdatei mit einem Zeitstempel im Dateinamen generiert wird, was den Dateien eine Reihenfolge gibt. Die Reihenfolge der Generierung ist auch die Reihenfolge der Migrationsoperation, wenn Sie den Artisan CLI-Befehl php artisan migrate ausführen.

Wenn also eine Datei nach einem Fremdschlüsselverweis fragt, der in einer späteren Datei erst noch generiert wird, wird der Fehler 1215 ausgelöst.

In einem solchen Fall müssen Sie die Reihenfolge der Generierung der Migrationsdateien anpassen. Erstellen Sie neue Dateien in der richtigen Reihenfolge, kopieren Sie den Inhalt hinein und löschen Sie dann die ungeordneten alten Dateien.

5voto

Alex Punkte 51

Ich habe den gleichen Fehler erhalten, als ich versucht habe, einen Fremdschlüssel hinzuzufügen. In meinem Fall wurde das Problem durch den Fremdschlüsseltabelle Primärschlüssel verursacht, der als unsigned markiert war.

5voto

Dennis Punkte 7383

Überprüfen Sie die Tabellenkompatibilität (Engine) mit SHOW TABLE STATUS WHERE Name = 'Tabellenname'.

Zum Beispiel, wenn eine Tabelle MyISAM ist und die andere InnoDB ist, kann dies ein Problem sein.

Sie können es mit diesem Befehl ändern:

ALTER TABLE myTable ENGINE = InnoDB;

Aus der Dokumentation.

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