J'ai des problèmes avec forward engineering
ma 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?
LATEST FOREIGN KEY ERROR
section de lastatus
colonne lorsque vous exécutez la commande d'état INNODB.Réponses:
Je vous ai cherché rapidement et cela m'a amené ici . Je cite:
Pour vérifier les contraintes, utilisez la requête SQL suivante:
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.
la source
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:
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:
Pour la table de l'OP, ce serait
Link_lession_id_fk
, par exemple.la source
Vous pouvez vous connecter à mysql et taper
Vous aurez toute la sortie et vous devriez avoir une meilleure idée de ce qu'est l'erreur.
la source
SHOW ENGINE INNODB STATUS
. Et il doit être exécuté immédiatement après avoir obtenu l'erreur pour obtenir les informations pertinentes.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.
la source
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:
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:
Après avoir découvert le nom de fichier, tel que # sql-9ad_15.frm, j'ai pu supprimer cette table orpheline dans MySQL:
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."
la source
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.
la source
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!
la source
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
la source