Ich habe Probleme mit forward engineering
meiner MySQL-Datenbank auf dem WAMP-Server. Ich wollte ein Bild des Schemas veröffentlichen, aber da dies mein erster Beitrag ist, kann ich nicht.
Unten ist das ausgeführte Skript.
use aquaticstar;
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';
-- -----------------------------------------------------
-- Table `Students`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Students` ;
CREATE TABLE IF NOT EXISTS `Students` (
`id` VARCHAR(10) NOT NULL ,
`studentName` VARCHAR(45) NOT NULL ,
`gender` CHAR NOT NULL ,
`birthDate` DATETIME NOT NULL ,
`mNo` VARCHAR(10) NOT NULL ,
`contactName` VARCHAR(45) NOT NULL ,
`contactEmail` VARCHAR(45) NOT NULL ,
`contactPhone` INT(10) NOT NULL ,
`startDate` DATETIME NOT NULL ,
`remarks` VARCHAR(200) NULL ,
PRIMARY KEY (`id`) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Waiting List`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Waiting List` ;
CREATE TABLE IF NOT EXISTS `Waiting List` (
`wait_id` VARCHAR(5) NOT NULL ,
`name` VARCHAR(45) NULL ,
`contactName` VARCHAR(45) NULL ,
`contactPhone` INT(10) NULL ,
`contactEmail` VARCHAR(45) NULL ,
`status` CHAR NULL ,
`remarks` VARCHAR(200) NULL ,
PRIMARY KEY (`wait_id`) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Schedule`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Schedule` ;
CREATE TABLE IF NOT EXISTS `Schedule` (
`lesson_id` VARCHAR(10) NOT NULL ,
`day` VARCHAR(3) NOT NULL ,
`branch` VARCHAR(30) NOT NULL ,
`level` VARCHAR(30) NOT NULL ,
`time` TIME NOT NULL ,
`ae` VARCHAR(45) NOT NULL ,
PRIMARY KEY (`lesson_id`) )
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Link`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Link` ;
CREATE TABLE IF NOT EXISTS `Link` (
`link_id` VARCHAR(10) NOT NULL ,
`id` VARCHAR(10) NOT NULL ,
`lesson_id` VARCHAR(10) NOT NULL ,
PRIMARY KEY (`link_id`) ,
INDEX `id_idx` (`id` ASC) ,
INDEX `lesson_id_idx` (`lesson_id` ASC) ,
CONSTRAINT `id`
FOREIGN KEY (`id` )
REFERENCES `Students` (`id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION,
CONSTRAINT `lesson_id`
FOREIGN KEY (`lesson_id` )
REFERENCES `Schedule` (`lesson_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
-- -----------------------------------------------------
-- Table `Attendance`
-- -----------------------------------------------------
DROP TABLE IF EXISTS `Attendance` ;
CREATE TABLE IF NOT EXISTS `Attendance` (
`date` DATETIME NOT NULL ,
`attendance` VARCHAR(5) NOT NULL ,
`link_id` VARCHAR(10) NOT NULL ,
INDEX `link_id_idx` (`link_id` ASC) ,
CONSTRAINT `link_id`
FOREIGN KEY (`link_id` )
REFERENCES `Link` (`link_id` )
ON DELETE NO ACTION
ON UPDATE NO ACTION)
ENGINE = InnoDB;
SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;
-- -----------------------------------------------------
-- Data for table `Students`
-- -----------------------------------------------------
START TRANSACTION;
INSERT INTO `Students` (`id`, `studentName`, `gender`, `birthDate`, `mNo`, `contactName`, `contactEmail`, `contactPhone`, `startDate`, `remarks`) VALUES ('s001', 'Sam Khew', 'm', '12/12/1991', 'nm', 'May Khew', '[email protected]', 0198829387, '12/07/2011', NULL);
INSERT INTO `Students` (`id`, `studentName`, `gender`, `birthDate`, `mNo`, `contactName`, `contactEmail`, `contactPhone`, `startDate`, `remarks`) VALUES ('s002', 'Joe Biden', 'm', '13/03/2003', 'nm', 'Layla Biden', '[email protected]', 0199283763, '14/05/2011', NULL);
INSERT INTO `Students` (`id`, `studentName`, `gender`, `birthDate`, `mNo`, `contactName`, `contactEmail`, `contactPhone`, `startDate`, `remarks`) VALUES ('s003', 'Bob Builder', 'm', '14/02/2002', 'LK920K', 'Mama Builder', '[email protected]', 0167728376, '29/02/2012', NULL);
INSERT INTO `Students` (`id`, `studentName`, `gender`, `birthDate`, `mNo`, `contactName`, `contactEmail`, `contactPhone`, `startDate`, `remarks`) VALUES ('s004', 'Kenny Koh', 'm', '18/02/1999', 'MM992', 'Lisa Koh', '[email protected]', 0123160231, '19/01/2012', NULL);
INSERT INTO `Students` (`id`, `studentName`, `gender`, `birthDate`, `mNo`, `contactName`, `contactEmail`, `contactPhone`, `startDate`, `remarks`) VALUES ('s005', 'Jane Doe', 'f', '29/09/1999', 'nm', 'Jackie Doe', '[email protected]', 0127736254, '02/03/2012', NULL);
INSERT INTO `Students` (`id`, `studentName`, `gender`, `birthDate`, `mNo`, `contactName`, `contactEmail`, `contactPhone`, `startDate`, `remarks`) VALUES ('s006', 'Lola Lai', 'f', '02/05/2004', 'nm', 'Mark Lai', '[email protected]', 0198827365, '11/09/2011', NULL);
COMMIT;
-- -----------------------------------------------------
-- Data for table `Schedule`
-- -----------------------------------------------------
START TRANSACTION;
INSERT INTO `Schedule` (`lesson_id`, `day`, `branch`, `level`, `time`, `ae`) VALUES ('sat1_s4', 'Sat', 'Sunway', 'basic', '4pm', 'Aini');
INSERT INTO `Schedule` (`lesson_id`, `day`, `branch`, `level`, `time`, `ae`) VALUES ('sat1_s5', 'Sat', 'Sunway', 'basic', '5pm', 'Aini');
INSERT INTO `Schedule` (`lesson_id`, `day`, `branch`, `level`, `time`, `ae`) VALUES ('sat1_s6', 'Sat', 'Sunway', 'basic', '6pm', 'Aini');
INSERT INTO `Schedule` (`lesson_id`, `day`, `branch`, `level`, `time`, `ae`) VALUES ('sat2_s4', 'Sat', 'Sunway', 'advance', '4pm', 'Nina');
INSERT INTO `Schedule` (`lesson_id`, `day`, `branch`, `level`, `time`, `ae`) VALUES ('sat2_s5', 'Sat', 'Sunway', 'advance', '5pm', 'Nina');
INSERT INTO `Schedule` (`lesson_id`, `day`, `branch`, `level`, `time`, `ae`) VALUES ('sat3_s6', 'Sat', 'Sunway', 'pre-comp', '6pm', 'Marcus');
COMMIT;
-- -----------------------------------------------------
-- Data for table `Link`
-- -----------------------------------------------------
START TRANSACTION;
INSERT INTO `Link` (`link_id`, `id`, `lesson_id`) VALUES ('L001', 's001', 'sat1_s4');
INSERT INTO `Link` (`link_id`, `id`, `lesson_id`) VALUES ('L002', 's002', 'sat1_s5');
INSERT INTO `Link` (`link_id`, `id`, `lesson_id`) VALUES ('L003', 's003', 'sat1_s6');
INSERT INTO `Link` (`link_id`, `id`, `lesson_id`) VALUES ('L004', 's004', 'sat2_s4');
INSERT INTO `Link` (`link_id`, `id`, `lesson_id`) VALUES ('L005', 's005', 'sat1_s5');
COMMIT;
-- -----------------------------------------------------
-- Data for table `Attendance`
-- -----------------------------------------------------
START TRANSACTION;
INSERT INTO `Attendance` (`date`, `attendance`, `link_id`) VALUES ('26/9/2012', '1', NULL);
COMMIT;
Aber dann bekomme ich diesen Fehler:
Executing SQL script in server
ERROR: Error 1005: Can't create table 'aquaticstar.link' (errno: 121)
Ich kann nicht herausfinden warum. Kann mir jemand helfen?
LATEST FOREIGN KEY ERROR
Abschnitt derstatus
Spalte gespeichert, wenn Sie den Befehl INNODB status ausführen.Antworten:
Ich habe schnell nach dir gesucht und es hat mich hierher gebracht . Ich zitiere:
Verwenden Sie zum Überprüfen von Einschränkungen die folgende SQL-Abfrage:
Suchen Sie dort nach weiteren Informationen oder versuchen Sie herauszufinden, wo der Fehler auftritt. Sieht für mich nach einem Problem mit einem Fremdschlüssel aus.
quelle
Namen von Fremdschlüsseleinschränkungen müssen innerhalb einer Datenbank eindeutig sein
Sowohl die Antwort von @ Dorvalla als auch dieser oben erwähnte Blog-Beitrag haben mich in die richtige Richtung gelenkt , um das Problem für mich selbst zu beheben. zitiert aus letzterem:
Das war mir nicht bewusst. Ich habe meine Namen für Fremdschlüsseleinschränkungen gemäß dem folgenden Schema geändert, das anscheinend auch von Ruby on Rails-Anwendungen verwendet wird:
Für die Tabelle des OP wäre dies
Link_lession_id_fk
zum Beispiel.quelle
Sie können sich bei MySQL anmelden und eingeben
Sie haben die gesamte Ausgabe und sollten eine bessere Vorstellung davon haben, was der Fehler ist.
quelle
SHOW ENGINE INNODB STATUS
. Und es muss sofort nach Erhalt des Fehlers ausgeführt werden, um die relevanten Informationen zu erhalten.Wenn Sie in einer Tabelle eine Fremdschlüsseldefinition haben und der Name des Fremdschlüssels an anderer Stelle als anderer Fremdschlüssel verwendet wird, tritt dieser Fehler auf.
quelle
Ich hatte diesen Fehler (Fehler Nr. 121), der jedoch durch von MySQL erstellte Zwischentabellen verursacht wurde, die verwaist waren, sodass ich keine Tabelle ändern konnte, obwohl in keiner meiner Tabellen ein solcher Einschränkungsname vorhanden war. Irgendwann war mein MySQL abgestürzt oder konnte eine Zwischentabelle (Tabellenname beginnend mit einem # sql-) nicht bereinigen, was zu einem Fehler führte wie: Tabelle '# sql-' kann nicht erstellt werden (errno 121) beim Versuch, eine ALTER TABLE mit bestimmten Einschränkungsnamen auszuführen.
Gemäß den Dokumenten unter http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooter-datadict.html können Sie nach diesen verwaisten Tabellen suchen mit:
Die Version, mit der ich gearbeitet habe, war 5.1, aber der obige Befehl funktioniert nur bei Versionen> = 5.6 (das Handbuch funktioniert nicht für 5.5 oder früher, da INNODB_SYS_TABLES in solchen Versionen nicht vorhanden ist). Ich konnte die verwaiste temporäre Tabelle (die nicht mit der in der Nachricht genannten übereinstimmte) finden, indem ich mein MySQL-Datenverzeichnis in der Befehlszeile durchsuchte:
Nachdem ich den Dateinamen wie # sql-9ad_15.frm entdeckt hatte, konnte ich diese verwaiste Tabelle in MySQL löschen:
Danach konnte ich meine ALTER TABLE erfolgreich ausführen.
Der Vollständigkeit halber weist das Präfix # mysql50 # MySQL gemäß der verlinkten MySQL-Dokumentation an, die in MySQL 5.1 eingeführte sichere Codierung für Dateinamen zu ignorieren.
quelle
Wenn Sie das Problem schnell beheben möchten, leiten Sie den Forward Engineer erneut ein und aktivieren Sie die Option "DROP SCHEMA generieren". Fahren Sie fort.
Ich gehe davon aus, dass die Datenbank keine Daten enthält, sodass das Löschen keine Auswirkungen hat.
quelle
Mir ist aufgefallen, dass ich "other_database" und "Other_Database" in meinen Datenbanken hatte. Das verursachte dieses Problem, da ich tatsächlich dieselbe Referenz in einer anderen Datenbank hatte, die diesen mysteriösen Fehler verursachte!
quelle
In meinem Fall kann jedoch nur dieser Weg helfen:
1. Erstellen Sie eine Sicherungskopie der aktuellen Datenbank. 2. Löschen Sie die Datenbank
(nicht alle Tabellen, sondern
die Datenbank). 3. Erstellen Sie eine Datenbank (überprüfen Sie, ob Sie noch über Berechtigungen verfügen).
4. Stellen Sie die Datenbank aus der Sicherung wieder her
quelle