MySQL Workbench rename vincolo
-
30-09-2019 - |
Domanda
Io uso MySQL Workbench per progettare il mio database e quindi di esportare lo SQL CREATE script. Ma quando ho eseguito questo script per creare il database, ottengo un errore - errno: 121.
Si scopre che MySQL Workbench dà due vincoli lo stesso nome, perché entrambi i vincoli utilizzano la stessa chiave (ho una tabella con la chiave primaria 'ID ruolo' e mi riferimento questa chiave in altre due tabelle).
C'è un modo come posso rinominare il vincolo direttamente nella finestra di progettazione, in modo da quando ho l'ora ingegnere SQL CREATE script, vi darà nessun errore?
Ho provato a fare doppio clic il rapporto nella finestra di progettazione e dare una nuova didascalia, ma genera ancora lo script con il nome originale.
Una parte del script generato che crea l'errore:
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
));
Soluzione
Non sei sicuro di come sei finito con quello. Ho preso MySQL Workbench per un giro, ha creato due tabelle con un FK e ha creato
-- -----------------------------------------------------
-- 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;
Si noti che il vincolo ha un nome univoco 'fk_usersRoles_users' che non sarebbe ottenere duplicati in quanto utilizza i nomi di tabella. Solo per divertimento ho aggiunto un altro rapporto tra le stesse tabelle e per impostazione predefinita ottengo
-- -----------------------------------------------------
-- 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;
Che ancora una volta non è un problema (tutto quanto sopra è generata automaticamente - ho solo impostare i nomi di tabella, chiave primaria nella tabella di riferimento e ha aggiunto due 1: N rapporti)
NOTE:. Versione 5.2.30
Modifica Forse è successo qualcosa con le vostre preferenze. Il nome predefinito per i vincoli FK è definita sul modello scheda.
Altri suggerimenti
Quando si imposta un vincoli per le chiavi esterne, non assegnerà nome diverso che si riferisce stessa chiave primaria di qualche tavolo. Allora, che cosa sto cercando di dire è che controllare tutti i nomi degli indici in tutti gli script generati lì se doppioni. Rinominare a qualche altro. Poi si può procedere ...