ERRORE: Errore 1005: Impossibile creare la tabella (errno: 121)


108

Ho problemi con il forward engineeringmio database MySQL nel server WAMP .. Stavo per pubblicare un'immagine dello schema ma poiché questo è il mio primo post non posso.

Di seguito è riportato lo script eseguito ..

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', 'may@gmail.com', 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', 'layla@gmail.com', 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', 'mama@yahoo.com', 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', 'lk@hotmail.com', 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', 'jackied@gmail.com', 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', 'mark@gmail.com', 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;

Ma poi ottengo questo errore:

Executing SQL script in server
ERROR: Error 1005: Can't create table 'aquaticstar.link' (errno: 121)

Non riesco a capire perché. Qualcuno può aiutarmi?


2
Se si dispone dell'autorizzazione di amministratore sul server, è possibile iniziare eseguendo il comando MySQL "SHOW INNODB STATUS" (o MySQL 5.5 "SHOW ENGINE INNODB STATUS") immediatamente dopo aver ricevuto l'errore. Questo comando visualizza le informazioni di registro e i dettagli dell'errore. Da lì puoi vedere dove va storto
Dorvalla

1
La risposta di @Dorvalla lo ha risolto. In effetti, il registro degli errori dettagliato viene memorizzato nella LATEST FOREIGN KEY ERRORsezione della statuscolonna quando si esegue il comando di stato INNODB.
Devy

Risposte:


237

Ti ho cercato velocemente e mi ha portato qui . Quoto:

Riceverai questo messaggio se stai cercando di aggiungere un vincolo con un nome che è già utilizzato da qualche altra parte

Per verificare i vincoli utilizzare la seguente query SQL:

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

Cerca ulteriori informazioni lì o prova a vedere dove si verifica l'errore. A me sembra un problema con una chiave esterna.


Questa risposta è stata la migliore finora .. grazie .. quindi quello che è venuto fuori era che c'erano 3 vincoli, 2 dei quali sono gli stessi ... ma eh quelli che sono gli stessi provenivano da una tabella che ho cancellato prima? Allora cosa devo fare?
user1703514

1
Prova questo thread Prova a eliminare il vincolo, altrimenti lo modifichi. Non sono sicuro di come, perché non ho familiarità con esso, ma sembrerebbe logico se puoi richiamare i vincoli, puoi anche eliminarli o modificarli.
Dorvalla

È più comune provare a utilizzare lo stesso nome di chiave esterna due volte!
Danno

26

I nomi dei vincoli di chiave esterna devono essere univoci all'interno di un database

Tutti e due la risposta di @ Dorvalla che questo post del blog menzionato sopra mi hanno indirizzato nella giusta direzione per risolvere il problema da solo; citando da quest'ultimo:

Se la tabella che stai tentando di creare include un vincolo di chiave esterna e hai fornito il tuo nome per quel vincolo, ricorda che deve essere univoco all'interno del database.

Non ne ero consapevole. Ho cambiato i nomi dei miei vincoli di chiave esterna in base al seguente schema che sembra essere utilizzato anche dalle applicazioni Ruby on Rails:

<TABLE_NAME>_<FOREIGN_KEY_COLUMN_NAME>_fk

Per la tabella dell'OP questo sarebbe Link_lession_id_fk, ad esempio.


6

Puoi accedere a mysql e digitare

mysql> SHOW INNODB STATUS\G

Avrai tutto l'output e dovresti avere un'idea migliore di quale sia l'errore.


1
In MySQL 5.5, è SHOW ENGINE INNODB STATUS. E deve essere eseguito immediatamente dopo aver ricevuto l'errore per ottenere le informazioni pertinenti.
Devy

2

Se hai una definizione di chiave esterna in una tabella e il nome della chiave esterna viene utilizzato altrove come un'altra chiave esterna, avrai questo errore.


2

Ho riscontrato questo errore (errno 121) ma è stato causato da tabelle intermedie create da mysql che erano rimaste orfane, impedendomi di modificare una tabella anche se nessun nome di tale vincolo esisteva in nessuna delle mie tabelle. Ad un certo punto, il mio MySQL si è bloccato o non è riuscito a pulire una tabella intermedia (il nome della tabella inizia con # sql-) che ha finito per presentarmi con un errore del tipo: Impossibile creare la tabella '# sql-' (errno 121) quando si tenta di eseguire un ALTER TABLE con determinati nomi di vincoli.

Secondo i documenti su http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting-datadict.html , puoi cercare queste tabelle orfane con:

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

La versione con cui stavo lavorando era la 5.1, ma il comando precedente funziona solo sulle versioni> = 5.6 (il manuale non è corretto sul fatto che funzioni per 5.5 o precedenti, perché INNODB_SYS_TABLES non esiste in tali versioni). Sono stato in grado di trovare la tabella temporanea orfana (che non corrispondeva a quella indicata nel messaggio) cercando nella mia directory di dati mysql nella riga di comando:

find . -iname '#*'

Dopo aver scoperto il nome del file, come # sql-9ad_15.frm, sono stato in grado di rilasciare quella tabella orfana in MySQL:

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

Dopo averlo fatto, sono stato quindi in grado di eseguire correttamente il mio ALTER TABLE.

Per completezza, come da documentazione MySQL collegata, "il prefisso # mysql50 # dice a MySQL di ignorare la codifica sicura del nome file introdotta in MySQL 5.1."


1

Se vuoi risolvere rapidamente, Forward Engineer di nuovo e seleziona l'opzione "Genera DROP SCHEMA" e procedi.

Presumo che il database non contenga dati, quindi eliminarlo non influirà.


0

Qualcosa che ho notato è che avevo "other_database" e "Other_Database" nei miei database. Ciò ha causato questo problema poiché in realtà avevo lo stesso riferimento in un altro database che ha causato questo misterioso errore!


-3
mysql> SHOW ENGINE INNODB STATUS;

Ma nel mio caso solo questo potrebbe aiutare:
1. Fare il backup del DB corrente
2. Eliminare il DB (non tutte le tabelle, ma DB)
3. Creare il DB (verificare di avere ancora i precedenti)
4. Ripristinare il DB dal backup

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.