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 ));

È stato utile?

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

Errore 121 è dovuto al nome del vincolo la duplicazione soluzione esempio Generalmente quando si generano lo script SQL opzione di esportazione MYSQL engineering in avanti con, per risolvere il problema dobbiamo fare in modo che solo la "chiave nomi stranieri" sono unici in script SQL / schema.

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 ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top