在事务期间将值插入关联表时出现此错误:
无法添加或更新子行:外键约束失败(dev.genre、CONSTRAINT fk_Genre_EntityType1 FOREIGN KEY (idEntityType) REFERENCESEntityType (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
表中插入关联,这就是我收到错误的原因。
我在网上搜索了很长一段时间,但我发现的唯一的就是这个帖子: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时有匹配。
关于事务中插入时 MySQL 外键约束错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16178984/