【问题标题】:MySQL foreign key constraint error on insert in transactionMySQL外键约束错误插入事务
【发布时间】:2013-04-23 20:54:28
【问题描述】:

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

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 表引用 EntityTypeStyle,仅此而已。

当我尝试创建一个新的Style 然后在Genre 表中添加一个关联时发生错误。

一切都在一个事务中,而我所做的是:

  • Style 表中创建新样式
  • 获取创建样式的id
  • genre 表中插入一个关联,这就是我收到错误的时候。

我在网上搜索了很长时间,但我唯一找到的就是这个 SO 帖子: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 表中。

【问题讨论】:

  • 您在idEntityType 列中插入了一个在EntityType 表中没有对应PK 值的值。
  • 嗯,这就是我首先检查的,我确定EntityType表中有对应的PK,这就是我不明白错误的原因......
  • 也许我没有为我的问题添加足够的元素,但我没有看到哪些元素。这是一个 C# mvc4 网站,我们使用标准 MySQL 连接器进行交易

标签: mysql stored-procedures foreign-keys innodb


【解决方案1】:

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

【讨论】:

  • 看我对这个问题的评论,Genre.idEntityTypeEntityType.idEntityType.... 有点奇怪...
  • 嗯...但显然有问题。请发布产生错误的查询。
  • 是的,显然有问题,你是对的!我仍然没有看到什么...发布了查询
  • 您发布了查询,但没有发布程序 :)
  • 如果您不想发布程序,请添加“SELECT p_idEntityType;”就在插入之前,然后调用该过程。您可能会发现该值不是您所期望的。
猜你喜欢
  • 2018-09-15
  • 2023-03-13
  • 2018-02-15
  • 2012-01-16
  • 2011-10-04
  • 2015-12-09
  • 1970-01-01
  • 2014-08-12
  • 1970-01-01
相关资源
最近更新 更多