Errno 121,写入或更新时重复键?

Posted

技术标签:

【中文标题】Errno 121,写入或更新时重复键?【英文标题】:Errno 121, duplicate key on write or update? 【发布时间】:2012-10-11 06:54:55 【问题描述】:
SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES';

CREATE SCHEMA IF NOT EXISTS `mydb` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci ;
USE `mydb` ;

-- -----------------------------------------------------
-- Table `mydb`.`restaurants`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`restaurants` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `name` VARCHAR(128) NOT NULL ,
  `description` VARCHAR(1024) NOT NULL ,
  `address` VARCHAR(1024) NOT NULL ,
  `phone` VARCHAR(16) NOT NULL ,
  `url` VARCHAR(128) NOT NULL ,
  `min_order` INT NOT NULL ,
  `food_types` SET('pizza', 'sushi', 'osetian_pie') NOT NULL ,
  PRIMARY KEY (`id`) ,
  UNIQUE INDEX `name_UNIQUE` (`name` ASC) ,
  UNIQUE INDEX `id_UNIQUE` (`id` ASC) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`regions`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`regions` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `restaurant` INT NOT NULL ,
  `name` VARCHAR(128) NOT NULL ,
  PRIMARY KEY (`id`) ,
  INDEX `restaurant_idx` (`restaurant` ASC) ,
  UNIQUE INDEX `id_UNIQUE` (`id` ASC) ,
  CONSTRAINT `restaurant`
    FOREIGN KEY (`restaurant` )
    REFERENCES `mydb`.`restaurants` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`food`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`food` (
  `id` INT NOT NULL ,
  `type` ENUM('pizza', 'sushi', 'osetian_pie') NOT NULL ,
  `name` VARCHAR(45) NOT NULL ,
  `ingredients` VARCHAR(256) NULL ,
  `image` VARCHAR(256) NOT NULL ,
  PRIMARY KEY (`id`) ,
  UNIQUE INDEX `id_UNIQUE` (`id` ASC) )
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `mydb`.`food_variant`
-- -----------------------------------------------------
CREATE  TABLE IF NOT EXISTS `mydb`.`food_variant` (
  `id` INT NOT NULL AUTO_INCREMENT ,
  `size` VARCHAR(16) NOT NULL ,
  `weight` VARCHAR(16) NOT NULL ,
  `price` INT NOT NULL ,
  `food` INT NOT NULL ,
  `restaurant` INT NOT NULL ,
  PRIMARY KEY (`id`) ,
  UNIQUE INDEX `id_UNIQUE` (`id` ASC) ,
  INDEX `food_idx` (`food` ASC) ,
  INDEX `restaurant_idx` (`restaurant` ASC) ,
  CONSTRAINT `food`
    FOREIGN KEY (`food` )
    REFERENCES `mydb`.`food` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `restaurant`
    FOREIGN KEY (`restaurant` )
    REFERENCES `mydb`.`restaurants` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;



SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;

Error is:
    Executing SQL script in server
    ERROR: Error 1005: Can't create table 'mydb.food_variant' (errno: 121)

我没有看到重复的约束。它在哪里?

【问题讨论】:

【参考方案1】:

这可能是因为您至少命名了一个与列具有相同标识符的约束:

/* You already have a column named `restaurant` in this table, 
   but are naming the FK CONSTRAINT `restaurant` also... */
CONSTRAINT `restaurant`
    FOREIGN KEY (`restaurant` )
    REFERENCES `mydb`.`restaurants` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)

应该为约束使用不同的标识符,例如fk_restaurant,如下所示:

CONSTRAINT `fk_restaurant`
    FOREIGN KEY (`restaurant` )
    REFERENCES `mydb`.`restaurants` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)

food 表中的内容相同:

  /* Name it fk_food */
  CONSTRAINT `fk_food`
    FOREIGN KEY (`food` )
    REFERENCES `mydb`.`food` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  /* Name it fk_restaurant */
  CONSTRAINT `fk_restaurant`
    FOREIGN KEY (`restaurant` )
    REFERENCES `mydb`.`restaurants` (`id` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)

我看到的只有这三个,但我可能错过了其他三个。

【讨论】:

万一有人遇到这个问题。即使在跨多个表更改约束名称之后,我也得到了 errno 121。问题是,即使跨不同的表,您也不能拥有相同的约束名称。我在 table1 和 table2 中使用了“fk_entryid”,必须分别将它们更改为“fk_table1_entryid”和“fk_table2_entryid”才能使其工作。这发生在 mysqlWorkbench 和 MariaDB 上,以防万一。【参考方案2】:

这个答案来自@Michael Berkowski 的the comment to the answer。我将其发布为答案,因为它实际上对我有用:

即使在更改了约束名称之后,我也得到了 errno 121 跨多个表。问题是,即使跨越不同的 不能具有相同约束名称的表。我正在使用 fk_entryidtable1table2 中,必须将它们更改为 fk_table1_entryidfk_table2_entryid 分别制作它 工作。

【讨论】:

【参考方案3】:

上面的所有答案都很棒,但即使在我删除了所有表之后也没有解决我的问题,但是一切都运行良好,并且在我删除数据库并再次创建它之后迁移运行顺利......似乎关键被缓存并且在表被删除后不会被清除。

注意:这不是问题的答案,而是我认为可能对其他人有所帮助的经验。

【讨论】:

这也是我的问题。我不得不完全删除数据库。我的猜测是前段时间我在停止 mysql 守护进程时遇到问题,不得不强行杀死它。 跟我一样。刚刚删除了数据库并重新导入它解决了问题 我们遇到了同样的问题。我们能够通过停止并重新启动 MySQL/MariaDB 服务器来解决它。因此,删除数据库可能是不必要的。【参考方案4】:

这是对@peter-moses 的一种回应,因为我遇到的问题与他完全相同。

我通过在我的转储命令中添加--add-drop-database 解决了这个问题。它记录在这里:https://mariadb.com/kb/en/mysqldump/

我的最终命令如下所示:

mysqldump -uroot -ppassword --single-transaction --all-databases --add-drop-database

【讨论】:

以上是关于Errno 121,写入或更新时重复键?的主要内容,如果未能解决你的问题,请参考以下文章

错误:执行 gem 时 ...(Errno::EPERM)不允许操作 [重复]

无法创建表`socialnetwork`.`login_tokens`(errno:150“外键约束格式不正确”)[重复]

SQLSTATE [HY000]:一般错误:1005无法创建表`Projectname`.`users`(errno:150“外键约束格式不正确”)[重复]

MySql - 无法添加或更新子外键约束失败[重复]

Python IOError 中的错误:[Errno 2] 没有这样的文件或目录:'data.csv' [重复]

没有这样的文件或目录:'results.txt' [重复]