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

标签 mysql stored-procedures foreign-keys innodb

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

无法添加或更新子行:外键约束失败(dev.genre、CONSTRAINT fk_Genre_EntityType1 FOREIGN KEY (idEntityType) REFERENCESEntityType (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 表中。

最佳答案

错误消息很明确:entitytype 由流派引用。这意味着实体类型中的所有行都必须在类型上匹配,否则无法插入。当genre.entitytype=entitytype.entitytype时有匹配。

关于事务中插入时 MySQL 外键约束错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16178984/

相关文章:

php - 不等于mysql查询codeigniter中的条件

MySQL 索引有两个相同的列

php - 2 个准备好的语句,2 个存储过程,1 个 mysqli 连接

MySQL - 也使用外键作为主键

sql - 添加与固定列值的关系

javascript - 函数在 Node.js 中被多次调用

mysql - Bluemix 云平台 : How to pass a value in node. js MySQL

MYSQL 循环函数不起作用

sql-server - 不允许执行存储过程

java - 如何使用jdbc在swing中用另一个字段替换外键?