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