在事务中插入时出现MySQL外键约束错误

时间:2013-04-23 20:54:29

标签: mysql stored-procedures foreign-keys innodb

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

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)

以下是描述所用表格的模式部分:

enter image description here

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

我在网上搜索了很长一段时间,但我发现的唯一一件事是这篇帖子: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表中。

1 个答案:

答案 0 :(得分:1)

错误消息是明确的:entitytype由类型引用。这意味着entitytype中的所有行必须具有流派匹配,或者不能插入。 genre.entitytype = entitytype.entitytype。

时匹配
相关问题