mysql 错误号121,写入或更新时是否复制密钥?

lh80um4z  于 2023-01-04  发布在  Mysql
关注(0)|答案(6)|浏览(141)
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)

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

apeeds0o

apeeds0o1#

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

/* 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)

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

pqwbnv8z

pqwbnv8z2#

这个答案来自于对@Michael Berkowski的答案的评论。我把它作为一个答案贴出来,因为它实际上对我很有效:
即使在多个表中更改了约束名,我还是得到了错误号121。问题是即使在不同的表中,您也不能具有相同的约束名。我在table1table2中使用fk_entryid,必须将它们分别更改为fk_table1_entryidfk_table2_entryid才能使其工作。

mv1qrgav

mv1qrgav3#

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

:这不是问题的答案,而是我的经验,我觉得可能会帮助其他人。

rryofs0p

rryofs0p4#

这是对@peter-moses的一种回应,因为我和他有着完全相同的问题。
我通过在dump命令中添加--add-drop-database解决了这个问题。https://mariadb.com/kb/en/mysqldump/
我的最后一条命令如下所示:
mysqldump -uroot -ppassword --single-transaction --all-databases --add-drop-database

wqsoz72f

wqsoz72f5#

在我的情况下,这是一个非常奇怪的缓存问题。我无法创建一个新的外键约束,尽管键的名称是唯一的。重新启动MariaDB服务器不是解决方案,但检查Foreign KeysReferences列表。
For example, in my Database navigator (I am using DBeaver) all my Foreign Keys lists were empty. However, when I navigated to the referenced table and checked its References list, I was able to see the entries. By the way, these entries were also not visible when executing a query against information_schema . 🤦‍♂️
从这个列表中删除引用之后,我就可以创建新的外键了。

    • 编辑**

执行SHOW ENGINE INNODB STATUS;并检查其LATEST FOREIGN KEY ERROR部分也可能有所帮助,因为它提供了问题的附加信息/上下文。

agxfikkp

agxfikkp6#

我正在使用DBeaver22.3.1,遇到了如下相同的问题:也就是说,[Foreign keys]节点上没有显示任何项目(见下图)。

然而,使用下面的select语句,它的存在是显而易见的(见图2)。因此,如果我试图创建一个同名的外键,错误显示为“duplicate”。

select * from INFORMATION_SCHEMA.TABLE_CONSTRAINTS 
where CONSTRAINT_SCHEMA = 'webstore' 
        AND CONSTRAINT_TYPE = 'FOREIGN KEY';

相关问题