Ограничение переименования MySQL Workbench
-
30-09-2019 - |
Вопрос
Я использую 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 определено на модель вкладка
Другие советы
Когда вы устанавливаете ограничения для иностранных ключей, не назначат другое имя, которое ссылается на то же первичный ключ из некоторой таблицы. Итак, я пытаюсь сказать, что проверяйте все ваши имена индексов во всех сгенерированных сценариях, если есть дублирование. Переименовать в какой -то другой. Тогда вы можете продолжить ...