Вопрос

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

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

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

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

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


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

СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ users.userRoles ( ... roleID INT НЕ NULL , ...ОГРАНИЧЕНИЕ roleIDВНЕШНИЙ КЛЮЧ (roleID ) ССЫЛКИ users.roles (roleID ));

СОЗДАТЬ ТАБЛИЦУ, ЕСЛИ НЕ СУЩЕСТВУЕТ users.resourcePrivileges ( roleID INT НЕ NULL , ...ОГРАНИЧЕНИЕ roleIDВНЕШНИЙ КЛЮЧ (roleID ) ССЫЛКИ users.roles (roleID ));

Это было полезно?

Решение

Не уверен, как вы оказались с этим. Я взял 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.

РЕДАКТИРОВАТЬМожет быть, что -то случилось с вашими предпочтениями. Имя по умолчанию для ограничений FK определено на модель вкладка

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top