在事务期间将值插入关联表时出现此错误:
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
表格引用EntityType
和Style
,仅此而已。
当我尝试创建一个新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
表中。