【问题标题】:MySQL Forward Engineer - SQL giving error 121MySQL Forward Engineer - SQL 给出错误 121
【发布时间】:2013-03-03 10:21:11
【问题描述】:

我目前正在尝试使用 MySQL Workbench 的 Forward Engineer 向导创建我的数据库,但我收到此错误:

Executing SQL script in server
ERROR: Error 1005: Can't create table 'microweb.users' (errno: 121)


CREATE  TABLE IF NOT EXISTS `microweb`.`users` (
  `user_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
  `role_id` INT UNSIGNED NOT NULL ,
  `username` VARCHAR(45) NOT NULL ,
  `password` VARCHAR(45) NOT NULL ,
  `email` VARCHAR(45) NOT NULL ,
  `salt` VARCHAR(45) NOT NULL ,
  `first_name` VARCHAR(45) NOT NULL ,
  `middle_name` VARCHAR(45) NULL ,
  `last_name` VARCHAR(45) NOT NULL ,
  `address_id` INT UNSIGNED NULL ,
  `registration_id` INT UNSIGNED NOT NULL ,
  `active` TINYINT(1) NOT NULL ,
  `banned` TINYINT(1) NOT NULL ,
  PRIMARY KEY (`user_id`) ,
  UNIQUE INDEX `user_id_UNIQUE` (`user_id` ASC) ,
  UNIQUE INDEX `username_UNIQUE` (`username` ASC) ,
  UNIQUE INDEX `email_UNIQUE` (`email` ASC) ,
  UNIQUE INDEX `registration_id_UNIQUE` (`registration_id` ASC) ,
  CONSTRAINT `fk_user_role`
    FOREIGN KEY (`role_id` )
    REFERENCES `microweb`.`roles` (`role_id` )
    ON DELETE CASCADE
    ON UPDATE CASCADE,
  CONSTRAINT `fk_user_registration`
    FOREIGN KEY (`registration_id` )
    REFERENCES `microweb`.`registrations` (`registration_id` )
    ON DELETE CASCADE
    ON UPDATE CASCADE)
ENGINE = InnoDB

SQL script execution finished: statements: 10 succeeded, 1 failed

完整的脚本包含大量外键和 21 个表。问题是当Workbench说有10个成功时,执行后phpMyAdmin中只有2个。

如果有人需要完整的模型,请告诉我。

【问题讨论】:

  • 这是哪个版本的 MySQL Workbench?你用的是最新的吗?
  • @MikeLischke 是的,我是 4 天前安装的。

标签: mysql foreign-keys mysql-workbench


【解决方案1】:

错误 121 表示存在重复的键名。您必须确保自己的所有 FK 名称在整个架构中都是唯一的。

【讨论】:

    【解决方案2】:

    我建议先尝试不使用约束,然后使用 ALTER TABLE 添加约束。

    CREATE  TABLE IF NOT EXISTS `microweb`.`users` (
      `user_id` INT UNSIGNED NOT NULL AUTO_INCREMENT ,
      `role_id` INT UNSIGNED NOT NULL ,
      `username` VARCHAR(45) NOT NULL ,
      `password` VARCHAR(45) NOT NULL ,
      `email` VARCHAR(45) NOT NULL ,
      `salt` VARCHAR(45) NOT NULL ,
      `first_name` VARCHAR(45) NOT NULL ,
      `middle_name` VARCHAR(45) NULL ,
      `last_name` VARCHAR(45) NOT NULL ,
      `address_id` INT UNSIGNED NULL ,
      `registration_id` INT UNSIGNED NOT NULL ,
      `active` TINYINT(1) NOT NULL ,
      `banned` TINYINT(1) NOT NULL ,
      PRIMARY KEY (`user_id`) ,
      UNIQUE INDEX `user_id_UNIQUE` (`user_id` ASC) ,
      UNIQUE INDEX `username_UNIQUE` (`username` ASC) ,
      UNIQUE INDEX `email_UNIQUE` (`email` ASC) ,
      UNIQUE INDEX `registration_id_UNIQUE` (`registration_id` ASC)
    )
    ENGINE = InnoDB;
    
    ALTER TABLE `microweb`.`users`
    ADD CONSTRAINT `fk_user_role`
        FOREIGN KEY (`role_id` )
        REFERENCES `microweb`.`roles` (`role_id` )
        ON DELETE CASCADE
        ON UPDATE CASCADE;
    
    ALTER TABLE `microweb`.`users`
    ADD CONSTRAINT `fk_user_registration`
        FOREIGN KEY (`registration_id` )
        REFERENCES `microweb`.`registrations` (`registration_id` )
        ON DELETE CASCADE
        ON UPDATE CASCADE;
    

    【讨论】:

    • 在使用 Workbench 的 Forward Engineer 向导时,有没有办法默认做到这一点?
    • 嗯,我可以使用 PHP 脚本或正则表达式来自动为外键创建“ALTER TABLE”查询吗?因为21张桌子,会很长!
    • 一个都不知道;我在没有 IDE 的情况下手工编写 DDL 语法
    猜你喜欢
    • 2010-11-13
    • 2011-03-19
    • 2017-07-23
    • 2014-02-16
    • 2011-04-27
    • 2017-06-08
    • 2011-05-23
    • 2013-01-01
    • 1970-01-01
    相关资源
    最近更新 更多