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

2voto

gathila Punkte 31

Ich kann diesen Fehler nicht finden

CREATE TABLE RATING (

Riv_Id INT(5),
Mov_Id INT(10) DEFAULT 0,
Stars INT(5),
Rating_date DATE, 

PRIMARY KEY (Riv_Id, Mov_Id),

FOREIGN KEY (Riv_Id) REFERENCES REVIEWER(Reviewer_ID)
ON DELETE SET NULL ON UPDATE CASCADE,

FOREIGN KEY (Mov_Id) REFERENCES MOVIE(Movie_ID)
ON DELETE SET DEFAULT ON UPDATE CASCADE
)

2voto

Rohan kumar Punkte 111

Sie können auch überprüfen, ob der Engine beider Tabellen auf InnoDB gesetzt ist.

2voto

Chad Punkte 637

Für mich waren es die Spaltentypen. BigINT != INT.

Aber dann hat es immer noch nicht funktioniert.

Also habe ich die Engines überprüft. Stellen Sie sicher, dass Table1 = InnoDB und Table = InnoDB.

2voto

robsch Punkte 8896

Ein weiterer Grund: Wenn Sie ON DELETE SET NULL verwenden, müssen alle Spalten, die im Fremdschlüssel verwendet werden, NULL-Werte zulassen. Jemand anderes hat das in dieser Frage herausgefunden.

Meines Erachtens wäre es kein Problem in Bezug auf die Datenintegrität, aber es scheint, dass MySQL diese Funktion einfach nicht unterstützt (in 5.7).

1voto

DukesNuz Punkte 87

Also habe ich alle oben genannten Lösungen ausprobiert, aber kein Glück gehabt. Möglicherweise habe ich den Fehler in meinen Tabellen übersehen - konnte die Ursache einfach nicht finden und habe immer den Fehler 1215 bekommen. Deshalb habe ich diese Lösung verwendet.

In meiner lokalen Umgebung in phpMyAdmin habe ich Daten aus der betroffenen Tabelle exportiert. Ich habe CSV als Format ausgewählt. Während ich immer noch in phpMyAdmin war und die Tabelle ausgewählt hatte, wählte ich "Mehr->Optionen". Hier habe ich heruntergescrollt zu "Tabelle kopieren (Datenbank.Tabelle)". "Struktur nur" ausgewählt. Benennen Sie die Tabelle um, vielleicht fügen Sie einfach das Wort "Kopie" neben dem aktuellen Tabellennamen hinzu. Klicken Sie auf "Los". Dadurch wird eine neue Tabelle erstellt. Exportieren Sie die neue Tabelle und importieren Sie sie in die neue oder andere Server. Ich verwende auch hier phpMyAdmin. Nach dem Importieren ändern Sie den Namen der Tabelle wieder in den Originalnamen. Wählen Sie die neue Tabelle aus, wählen Sie Import. Wählen Sie als Format CSV aus. Deaktivieren Sie "Fremdschlüsselprüfungen aktivieren". Wählen Sie "Los". Bisher funktioniert alles gut.

Ich habe meine Lösung auf meinem Blog veröffentlicht.

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