0

在事务期间将值插入关联表时出现此错误:

Cannot add or update a child row: a foreign key constraint fails (dev.genre, CONSTRAINT fk_Genre_EntityType1 FOREIGN KEY (idEntityType) REFERENCES entitytype (idEntityType) ON DELETE NO ACTION ON UPDATE NO ACTION)

以下是描述使用的表的架构部分:

在此处输入图像描述

这是genre表的创建语句:

-- -----------------------------------------------------
-- Table `dev`.`Genre`
-- -----------------------------------------------------

CREATE  TABLE IF NOT EXISTS `dev`.`Genre` (
  `idGenre` INT NOT NULL ,
  `Name` VARCHAR(45) NULL COMMENT 'musique, spectacle, expo' ,
  `idEntityType` INT NOT NULL ,
  `idStyle` INT NOT NULL ,
  PRIMARY KEY (`idGenre`, `idEntityType`, `idStyle`) ,
  INDEX `fk_Genre_EntityType1_idx` (`idEntityType` ASC) ,
  INDEX `fk_Genre_Style1_idx` (`idStyle` ASC) ,
  CONSTRAINT `fk_Genre_EntityType1`
    FOREIGN KEY (`idEntityType` )
    REFERENCES `dev`.`EntityType` (`idEntityType` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION,
  CONSTRAINT `fk_Genre_Style1`
    FOREIGN KEY (`idStyle` )
    REFERENCES `dev`.`Style` (`idStyle` )
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

继续,Genre表格引用EntityTypeStyle,仅此而已。

当我尝试创建一个新Style的然后在Genre表中添加一个关联时会发生错误。

一切都在交易中,我所做的是:

  • Style表格中创建新样式
  • 获取创建样式的id
  • 在表中插入一个关联,genre这就是我收到错误的时候。

我在网上搜索了很长时间,但我发现的唯一内容是这个 SO 帖子:在 MySQL 中,我可以将引用完整性检查推迟到提交之前

我不确定这就是这里的内容,因为错误发生在事务期间未更改的表上(EntityType)。还是我错过了什么?

有人可以解释一下我出现此错误的原因吗?(我被困在这里)

此外,如果它真的与我之前提到的 SO 帖子有关,是否有一种“干净”的方式来进行这种插入而不编写我自己的回滚机制?

感谢您的回答

编辑

插入新样式的第一个查询是:

CREATE PROCEDURE `Entity_CreateStyle`
(
    IN p_name varchar(45),
    OUT op_idStyle int(11)
)
BEGIN
    insert into Style(idParentStyle, Name, IsValidated)
    values(null, p_name, 0);

    SET op_idStyle = LAST_INSERT_ID();
END

下一个,产生错误:

CREATE PROCEDURE `Entity_AssociateStyleWithEntityType`
(
    IN p_idGenre int(11),
    IN p_Name varchar(45),
    IN p_idEntityType int(11),
    IN p_idStyle int(11)
)
BEGIN
    insert into Genre(idGenre, Name, idEntityType, idStyle)
    values(p_idGenre, p_Name, p_idEntityType, p_idStyle);
END

两者实际上都是我们使用 MySQL.Net 连接器从 C# 调用的存储过程

来自p_idEntityType模型(MVC),我检查了它的值是否正确并且存在于EntityType表中。

4

1 回答 1

1

错误信息很清楚:entitytype 是由流派引用的。这意味着 entitytype 中的所有行都必须在流派中匹配,否则无法插入。当genre.entitytype = entitytype.entitytype 时存在匹配。

于 2013-04-24T00:14:58.793 回答