ERREUR: Erreur 1005: Impossible de créer la table (numéro d'erreur: 121)

108

J'ai des problèmes avec forward engineeringma base de données MySQL sur le serveur WAMP. J'allais publier une image du schéma mais comme c'est mon premier message, je ne peux pas.

Voici le script exécuté.

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;

Mais alors j'obtiens cette erreur:

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

Je ne comprends pas pourquoi. Quelqu'un peut-il m'aider?

user1703514
la source
2
Si vous avez l'autorisation d'administrateur sur le serveur, vous pouvez commencer par exécuter la commande MySQL «SHOW INNODB STATUS» (ou MySQL 5.5 «SHOW ENGINE INNODB STATUS») immédiatement après avoir reçu l'erreur. Cette commande affiche les informations du journal et les détails de l'erreur. De là, vous pouvez voir où ça va mal
Dorvalla
1
La réponse de @Dorvalla l'a résolu. En fait, le journal des erreurs détaillées est stocké dans la LATEST FOREIGN KEY ERRORsection de la statuscolonne lorsque vous exécutez la commande d'état INNODB.
Devy

Réponses:

237

Je vous ai cherché rapidement et cela m'a amené ici . Je cite:

Vous recevrez ce message si vous essayez d'ajouter une contrainte avec un nom déjà utilisé ailleurs

Pour vérifier les contraintes, utilisez la requête SQL suivante:

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

Recherchez plus d'informations là-bas ou essayez de voir où l'erreur se produit. Cela me semble être un problème avec une clé étrangère.

Dorvalla
la source
Cette réponse était la meilleure jusqu'à présent .. merci .. donc ce qui s'est passé était qu'il y avait 3 contraintes, dont 2 sont les mêmes ... mais hein celles qui sont les mêmes venaient d'une table que j'ai supprimée plus tôt? Alors qu'est-ce que je fais?
user1703514
1
Essayez ce fil Essayez de supprimer la contrainte, sinon vous la modifiez. Je ne sais pas comment, car je ne suis pas familier avec cela, mais il semblerait logique que vous puissiez appeler les contraintes, vous pouvez les supprimer aussi, ou les modifier.
Dorvalla
Le plus souvent, vous essayez d'utiliser deux fois le même nom de clé étrangère!
Harm
26

Les noms de contrainte de clé étrangère doivent être uniques dans une base de données

Les deux @ La réponse de Dorvalla et ce blog mentionné ci - dessus m'a orienté dans la bonne direction pour résoudre le problème pour moi - même; citant ce dernier:

Si la table que vous essayez de créer inclut une contrainte de clé étrangère et que vous avez fourni votre propre nom pour cette contrainte, n'oubliez pas qu'elle doit être unique dans la base de données.

Je n'étais pas au courant de cela. J'ai changé mes noms de contrainte de clé étrangère selon le schéma suivant qui semble également être utilisé par les applications Ruby on Rails:

<TABLE_NAME>_<FOREIGN_KEY_COLUMN_NAME>_fk

Pour la table de l'OP, ce serait Link_lession_id_fk, par exemple.

Chriki
la source
6

Vous pouvez vous connecter à mysql et taper

mysql> SHOW INNODB STATUS\G

Vous aurez toute la sortie et vous devriez avoir une meilleure idée de ce qu'est l'erreur.

Marc
la source
1
Dans MySQL 5.5, c'est SHOW ENGINE INNODB STATUS. Et il doit être exécuté immédiatement après avoir obtenu l'erreur pour obtenir les informations pertinentes.
Devy le
2

Si vous avez une définition de clé étrangère dans une table et que le nom de la clé étrangère est utilisé ailleurs comme une autre clé étrangère, vous aurez cette erreur.

Giuseppe
la source
2

J'ai rencontré cette erreur (errno 121) mais elle a été causée par des tables intermédiaires créées par mysql qui étaient orphelines, m'empêchant de modifier une table même si aucun nom de contrainte de ce type n'existait dans aucune de mes tables. À un moment donné, MySQL s'est écrasé ou n'a pas réussi à nettoyer une table intermédiaire (nom de table commençant par # sql-) qui a fini par me présenter une erreur telle que: Impossible de créer la table '# sql-' (errno 121) lorsque vous essayez d'exécuter un ALTER TABLE avec certains noms de contraintes.

Selon la documentation sur http://dev.mysql.com/doc/refman/5.7/en/innodb-troubleshooting-datadict.html , vous pouvez rechercher ces tables orphelines avec:

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

La version avec laquelle je travaillais était 5.1, mais la commande ci-dessus ne fonctionne que sur les versions> = 5.6 (le manuel est incorrect quant à son fonctionnement pour la version 5.5 ou antérieure, car INNODB_SYS_TABLES n'existe pas dans de telles versions). J'ai pu trouver la table temporaire orpheline (qui ne correspondait pas à celle nommée dans le message) en recherchant mon répertoire de données mysql en ligne de commande:

find . -iname '#*'

Après avoir découvert le nom de fichier, tel que # sql-9ad_15.frm, j'ai pu supprimer cette table orpheline dans MySQL:

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

Après cela, j'ai pu exécuter avec succès mon ALTER TABLE.

Par souci d'exhaustivité, selon la documentation MySQL liée, "le préfixe # mysql50 # indique à MySQL d'ignorer l'encodage sécurisé des noms de fichiers introduit dans MySQL 5.1."

Patrick Brown
la source
1

Si vous voulez corriger rapidement, transférez à nouveau l'ingénieur et cochez l'option "Générer DROP SCHEMA" et continuez.

Je suppose que la base de données ne contient pas de données, donc sa suppression n'affectera pas.

Itsraja
la source
0

Quelque chose que j'ai remarqué, c'est que j'avais "other_database" et "Other_Database" dans mes bases de données. Cela a causé ce problème car j'avais en fait la même référence dans une autre base de données qui a causé cette erreur mystérieuse!

Roozbeh G
la source
-3
mysql> SHOW ENGINE INNODB STATUS;

Mais dans mon cas, seule cette manière pourrait aider:
1. Faites une sauvegarde de la base de données actuelle
2. Supprimez la base de données (pas toutes les tables, mais DB)
3. Créez une base de données (vérifiez que vous avez toujours des privilèges)
4. Restaurez la base de données à partir de la sauvegarde

phpWebStudio
la source