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

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表的create语句:

-- -----------------------------------------------------
-- 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表中插入一个关联,这就是我收到错误消息的时间。


我已经在网上搜索了很长时间,但是我发现的唯一发现是这样的帖子:In MySQL, can I defer referential integrity checks until commit

我不确定这是这里的原因,因为错误发生在事务(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表中。

最佳答案

错误消息很明显:实体类型由流派引用。这意味着entitytype中的所有行都必须具有匹配的流派,否则无法插入。 genre.entitytype = entitytype.entitytype时存在匹配项。

10-08 16:17