Ограничение переименования MySQL Workbench - PullRequest
2 голосов
/ 02 декабря 2010

Я использую MySQL Workbench для разработки своей базы данных, а затем для экспорта сценария SQL CREATE. Но когда я запускаю этот скрипт для создания базы данных, я получаю ошибку - errno: 121.

Оказывается, MySQL Workbench дает двум ограничениям одно и то же имя, потому что оба ограничения используют один и тот же ключ (у меня есть таблица с первичным ключом roleID, и я ссылаюсь на этот ключ в двух других таблицах).

Есть ли способ, как я могу переименовать ограничение непосредственно в конструкторе, поэтому, когда я перешлю инженерный сценарий SQL CREATE, он не выдаст ошибок?

Я попытался дважды щелкнуть мышью по отношению в конструкторе и присвоить ему новую подпись, но он по-прежнему генерирует сценарий с исходным именем.

Часть сгенерированного скрипта, которая создает ошибку:

<code>
CREATE  TABLE IF NOT EXISTS <code>users</code>.<code>roles</code> (
  <code>roleID</code> INT NOT NULL AUTO_INCREMENT ,
  ...
  PRIMARY KEY (<code>roleID</code>) ,
  ...);</p>

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

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

Ответы [ 3 ]

2 голосов
/ 02 декабря 2010

Не уверен, как ты это сделал. Я взял MySQL WorkBench для вращения, создал две таблицы с FK, и он создал

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

Обратите внимание, что ограничение имеет уникальное имя 'fk_usersRoles_users', которое не будет дублироваться, поскольку оно использует имена таблиц. Просто для забавы я добавил еще одну связь между теми же таблицами и по умолчанию я получаю

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

Что опять-таки не проблема (все вышеперечисленное генерируется автоматически - я установил только имена таблиц, первичный ключ в ссылочной таблице и добавил два отношения 1: N)

ПРИМЕЧАНИЯ: версия 5.2.30.

EDIT Может быть, что-то случилось с вашими предпочтениями. Имя по умолчанию для ограничений fk определено на вкладке модель .

0 голосов
/ 21 октября 2015

Ошибка 121 вызвана дублированием имени ограничения. solution example Как правило, при создании сценария SQL с опцией прямого экспорта MYSQL для решения проблемы нам просто нужно убедиться, что «Имена внешних ключей»уникальны в сценарии / схеме SQL.

0 голосов
/ 02 декабря 2010

Когда вы устанавливаете ограничения для внешних ключей, не будет назначаться другое имя, которое ссылается на один и тот же первичный ключ некоторой таблицы. Итак, я пытаюсь сказать, что проверьте все ваши имена индексов во всех сгенерированных скриптах, если есть дублирование. Переименуйте в другое. Тогда вы можете продолжить ...

...