2

我使用 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) ,
  ...);

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

4

3 回答 3

2

不知道你是怎么结束的。我使用 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 约束的默认名称在模型选项卡上定义。

于 2010-12-02T09:17:58.960 回答
0

错误 121 是由于约束名称重复。解决方案示例 通常在使用 MYSQL 正向工程导出选项生成 SQL 脚本时,要解决该问题,我们只需确保“外键名称”在 SQL 脚本/模式中是唯一的。

于 2015-10-21T13:29:03.177 回答
-1

当您为外键设置约束时,不会分配引用某个表的相同主键的不同名称。所以,我想说的是,如果有任何重复,请检查所有生成的脚本中的所有索引名称。重命名为其他。然后你可以继续...

于 2010-12-02T08:37:02.417 回答