2017-12-31 135 views
1

nicht erstellen Ich versuche, zwei Tabellen in der MySQL-Datenbank namens class_members und history zu erstellen. Die class_members Tabelle enthält Informationen über die Mitglieder und erstellt als:MySQL Foreign Key Fehler: Kann Tabelle

CREATE TABLE `class_members` (
    `id` int(11) NOT NULL, 
    `username` varchar(65) NOT NULL DEFAULT '', 
    `password` varchar(65) NOT NULL DEFAULT '', 
    `email` varchar(65) NOT NULL, 
    `mod_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `username_UNIQUE` (`username`), 
    UNIQUE KEY `id_UNIQUE` (`id`), 
    UNIQUE KEY `email_UNIQUE` (`email`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 

Die class_members Tabellen erfolgreich erstellt.

Ich bin vor das Problem, wenn history Tabelle erstellt, die foreign key Bezug auf class_members enthält.

Der Befehl, den ich ist wie folgt verwendet:

CREATE TABLE `History` ( 
    `history_id` INT(11) NOT NULL AUTO_INCREMENT, 
    `username` VARCHAR(65) NOT NULL DEFAULT '', 
    `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `ip` VARCHAR(20) NOT NULL, 
    PRIMARY KEY (`history_id`), 
    CONSTRAINT `fk_history_member` FOREIGN KEY (`username`) 
    REFERENCES `class_members` (`username`) 
    ON UPDATE CASCADE); 

Wenn ich den obigen Befehl ausführen bekomme ich diesen Fehler:

ERROR 1005 (HY000): Can't create table 'testDB.History' (errno: 150) 

Ich habe versucht zu finden, warum ich nicht die History Tabelle lesen (about ERROR 1005) aber ich kann nicht verstehen warum


Im Anschluss an Kommentare habe ich eine neue Datenbank erstellt und versucht, mit dem obigen Befehl zu erstellen, und ich bekomme immer noch den Fehler. Siehe Pic Befestigt enter image description here


Aktualisiert (Gelöst)

fand ich, warum der Fehler im obigen Screenshot auftritt. Um das zu lösen, müssen wir ENGINE=InnoDB DEFAULT CHARSET=utf8 am Ende des Erstellungsbefehls für die Protokolltabelle hinzufügen.

CREATE TABLE `History` ( 
    `history_id` INT(11) NOT NULL AUTO_INCREMENT, 
    `username` VARCHAR(65) NOT NULL DEFAULT '', 
    `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `ip` VARCHAR(20) NOT NULL, 
    PRIMARY KEY (`history_id`), 
    CONSTRAINT `fk_history_member` FOREIGN KEY (`username`) 
    REFERENCES `class_members` (`username`) 
    ON UPDATE CASCADE)ENGINE=InnoDB DEFAULT CHARSET=utf8; 

Dies funktioniert perfekt.

+0

Habe ich das gerade referenziert? Würde mich freuen, wenn Sie helfen könnten, statt zu versuchen, Punkte zu bekommen –

+0

Ich bin mir nicht sicher, wie ich Punkte für die Kennzeichnung als Duplikat bekomme? Wenn diese Beiträge Ihnen helfen, hilft es oder denke ich falsch? Aber es scheint, dass der gezielte Beitrag mehr oder weniger ein Duplikat aus dem Beitrag ist, auf den Sie verwiesen haben. – Ivar

+0

Ich habe gegooglet und lese alle diese und ich bin immer noch nicht in der Lage, das Problem zu lösen, weshalb ich dachte, die Frage zu stellen. Vielleicht ist meine Syntax falsch oder ich habe einige Konzepte auf Fremdschlüssel verpasst. Deshalb habe ich versucht, den Befehl –

Antwort

2

Ihre Abfrage funktioniert unter rextester.

Stellen Sie sicher, dass Sie nicht bereits eine vorhandene Tabelle mit der Bezeichnung history haben. Wenn ich die history Tabelle neu erstellen, erhalte ich:

Cannot delete or update a parent row: a foreign key constraint fails

Sie können dies reproduzieren, indem die rextester Abfrage einmal läuft, dann entfernen Sie die drop table if exists history; Linie, und es erneut aus.

Wenn Sie versuchen, die Tabelle zweimal in der gleichen Charge zu erstellen, erhalten Sie diese stattdessen:

Table 'history' already exists

+0

Aber seltsamerweise, auch wenn ich das tue, schlägt es immer noch fehl: http://rexttester.com/EKTL92226 –

+1

@TimBiegeleisen: Natürlich müssen Sie 'Geschichte' fallen lassen bevor' class_members' fallen :) – Andomar

+0

Netter Haken +1 ... hätte nicht daran gedacht –

0

Ich denke, das Problem vom Ursprung des Index ist. Probieren Sie den Code auf diese Weise;

CREATE TABLE `class_members` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `username` varchar(65) NOT NULL DEFAULT '', 
    `password` varchar(65) NOT NULL DEFAULT '', 
    `email` varchar(65) NOT NULL, 
    `mod_timestamp` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    PRIMARY KEY (`id`), 
    UNIQUE KEY `username_UNIQUE` (`username`), 
    UNIQUE KEY `id_UNIQUE` (`id`), 
    UNIQUE KEY `email_UNIQUE` (`email`), 
    INDEX `index_username` (`username`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8; 

CREATE TABLE `History` ( 
    `history_id` INT(11) NOT NULL AUTO_INCREMENT, 
    `username` VARCHAR(65) NOT NULL DEFAULT '', 
    `timestamp` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, 
    `ip` VARCHAR(20) NOT NULL, 
    PRIMARY KEY (`history_id`), 
    CONSTRAINT `fk_history_member` FOREIGN KEY (`username`) 
    REFERENCES `class_members` (`username`) 
    ON UPDATE CASCADE); 

Für SQLFiddle-Beispiel;Click Here