MySQL Workbench renommage contrainte
-
30-09-2019 - |
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
));
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
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 ...