我使用MySQL Workbench设计我的数据库,然后导出SQL CREATE脚本。但是当我运行这个脚本来创建数据库时,我收到一个错误 - 错误: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
));
答案 0 :(得分: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约束的默认名称在model选项卡上定义。
答案 1 :(得分:0)
答案 2 :(得分:-1)
为外键设置约束时,不会指定引用某些表的相同主键的不同名称。所以,我想说的是,如果有任何重复,请检查所有生成的脚本中的所有索引名称。重命名为其他人。然后你可以继续......