Question

J'utilise MySQL Workbench pour concevoir ma base de données, puis d'exporter le script SQL CREATE. Mais quand je lance ce script pour créer la base de données, je reçois une erreur - errno: 121.

Il se trouve que MySQL Workbench donne deux contraintes du même nom, parce que les deux contraintes utilisent la même clé (j'ai une table avec clé primaire 'RoleId et je référence cette clé dans deux autres tables).

Est-il possible que je peux renommer la contrainte directement dans le concepteur, alors quand j'ingénieur en avant le script SQL CREATE, il ne produira aucune erreur?

I Tried cliquez deux fois sur la relation dans le concepteur et lui donner une nouvelle légende, mais il génère toujours le script avec le nom d'origine.

Une partie du script généré qui crée l'erreur:


CREATE  TABLE IF NOT EXISTS users.roles (
  roleID INT NOT NULL AUTO_INCREMENT ,
  ...
  PRIMARY KEY (roleID) ,
  ...);

CREATE TABLE IF NOT EXISTS users.userRoles ( ... roleID INT NOT NULL , ... CONSTRAINT roleID FOREIGN KEY (roleID ) REFERENCES users.roles (roleID ));

CREATE TABLE IF NOT EXISTS users.resourcePrivileges ( roleID INT NOT NULL , ... CONSTRAINT roleID FOREIGN KEY (roleID ) REFERENCES users.roles (roleID ));

Était-ce utile?

La solution

Je ne sais pas comment vous avez fini avec cela. Je pris MySQL WorkBench pour un spin, créé deux tables avec une FK et il a créé

-- -----------------------------------------------------
-- Table `mydb`.`users`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`users` (
  `idusers` INT NULL ,
  PRIMARY KEY (`idusers`) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`usersRoles`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`usersRoles` (
  `users_idusers` INT NOT NULL ,
  PRIMARY KEY (`users_idusers`) ,
  CONSTRAINT `fk_usersRoles_users`
    FOREIGN KEY (`users_idusers` )
    REFERENCES `mydb`.`users` (`idusers` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

Notez que la contrainte a un nom unique « fk_usersRoles_users » qui ne se dupliqués car il utilise les noms de tables. Juste pour le plaisir, j'ai ajouté une autre relation entre les mêmes tables et par défaut, je reçois

-- -----------------------------------------------------
-- Table `mydb`.`usersRoles`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`usersRoles` (
  `users_idusers` INT NOT NULL ,
  `users_idusers1` INT NOT NULL ,
  PRIMARY KEY (`users_idusers`, `users_idusers1`) ,
  INDEX `fk_usersRoles_users1` (`users_idusers1` ASC) ,
  CONSTRAINT `fk_usersRoles_users`
    FOREIGN KEY (`users_idusers` )
    REFERENCES `mydb`.`users` (`idusers` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_usersRoles_users1`
    FOREIGN KEY (`users_idusers1` )
    REFERENCES `mydb`.`users` (`idusers` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

Ce qui est à nouveau un problème non (de ce qui précède est généré automatiquement - je n'ai mis les noms de table, clé primaire sur la table référencée et a ajouté deux 1: relations N)

NOTES:. Version 5.2.30

EDIT Peut-être que quelque chose est arrivé avec vos préférences. Le nom par défaut pour les contraintes fk est défini sur le modèle onglet.

Autres conseils

Erreur 121 est due à la duplication de nom de contrainte En général, lors de la génération de votre script SQL avec option d'exportation d'ingénierie avant MYSQL, pour résoudre le problème, nous devons simplement veiller à ce que les « noms étrangers clés » sont uniques dans le script SQL / schéma.

Lorsque vous définissez une contrainte pour les clés étrangères, ne cédera pas autre nom que la référence même clé primaire d'une certaine table. Alors, que je veux dire est que vérifier tous vos noms d'index dans tous les scripts générés s'il y a une duplication. Renommer à un autre. Ensuite, vous pouvez procéder ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top