FEHLER: Fehler 1005: Tabelle kann nicht erstellt werden (Fehler: 121)

108

Ich habe Probleme mit forward engineeringmeiner 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?

user1703514
quelle
2
Wenn Sie über Administratorrechte auf dem Server verfügen, können Sie zunächst den MySQL-Befehl "SHOW INNODB STATUS" (oder MySQL 5.5 "SHOW ENGINE INNODB STATUS") unmittelbar nach Erhalt des Fehlers ausführen. Dieser Befehl zeigt Protokollinformationen und Fehlerdetails an. Von dort können Sie sehen, wo es schief geht
Dorvalla
1
@ Dorvallas Antwort hat es gelöst. Tatsächlich wird das Detailfehlerprotokoll in einem LATEST FOREIGN KEY ERRORAbschnitt der statusSpalte gespeichert, wenn Sie den Befehl INNODB status ausführen.
Devy

Antworten:

237

Ich habe schnell nach dir gesucht und es hat mich hierher gebracht . Ich zitiere:

Sie erhalten diese Meldung, wenn Sie versuchen, eine Einschränkung mit einem Namen hinzuzufügen, der bereits an einer anderen Stelle verwendet wird

Verwenden Sie zum Überprüfen von Einschränkungen die folgende SQL-Abfrage:

SELECT
    constraint_name,
    table_name
FROM
    information_schema.table_constraints
WHERE
    constraint_type = 'FOREIGN KEY'
AND table_schema = DATABASE()
ORDER BY
    constraint_name;

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.

Dorvalla
quelle
Diese Antwort war die bisher beste. Danke. Es gab also drei Einschränkungen, von denen zwei gleich sind. Aber die gleichen Einschränkungen stammen aus einer Tabelle, die ich zuvor gelöscht habe. Also was mache ich?
user1703514
1
Versuchen Sie diesen Thread Versuchen Sie, die Einschränkung zu löschen, andernfalls ändern Sie sie. Ich bin mir nicht sicher, wie, weil ich nicht damit vertraut bin, aber es erscheint logisch, wenn Sie die Einschränkungen aufrufen, sie auch löschen oder ändern können.
Dorvalla
Am häufigsten versuchen Sie, denselben Fremdschlüsselnamen zweimal zu verwenden!
Harm
26

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:

Wenn die Tabelle, die Sie erstellen möchten, eine Fremdschlüsseleinschränkung enthält und Sie Ihren eigenen Namen für diese Einschränkung angegeben haben, denken Sie daran, dass sie in der Datenbank eindeutig sein muss.

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:

<TABLE_NAME>_<FOREIGN_KEY_COLUMN_NAME>_fk

Für die Tabelle des OP wäre dies Link_lession_id_fkzum Beispiel.

Chriki
quelle
6

Sie können sich bei MySQL anmelden und eingeben

mysql> SHOW INNODB STATUS\G

Sie haben die gesamte Ausgabe und sollten eine bessere Vorstellung davon haben, was der Fehler ist.

Marc
quelle
1
In MySQL 5.5 ist es SHOW ENGINE INNODB STATUS. Und es muss sofort nach Erhalt des Fehlers ausgeführt werden, um die relevanten Informationen zu erhalten.
Devy
2

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.

giuseppe
quelle
2

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:

SELECT * FROM INFORMATION_SCHEMA.INNODB_SYS_TABLES WHERE NAME LIKE '%#sql%';

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:

find . -iname '#*'

Nachdem ich den Dateinamen wie # sql-9ad_15.frm entdeckt hatte, konnte ich diese verwaiste Tabelle in MySQL löschen:

USE myschema;
DROP TABLE `#mysql50##sql-9ad_15`;

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.

Patrick Brown
quelle
1

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.

itsraja
quelle
0

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!

Roozbeh G.
quelle
-3
mysql> SHOW ENGINE INNODB STATUS;

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

phpWebStudio
quelle