在事务期间将值插入关联表时出现此错误:
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
表格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
表中。
答案 0 :(得分:1)
错误消息是明确的:entitytype由类型引用。这意味着entitytype中的所有行必须具有流派匹配,或者不能插入。 genre.entitytype = entitytype.entitytype。
时匹配