外键约束失败,因为insert语句尚未提交(MySQL)

时间:2012-11-05 19:57:51

标签: php mysql doctrine-orm

我有一个使用Doctrine 2的PHP脚本,它主要执行以下操作:

$entityManager->transactional(function($em) {
    $foreignObject = new DoctrineEntities\ForeignTable();
    $em->persist($foreignObject);
    $em->flush();
    $aObject = new DoctrineEntities\A();
    $aObject->ForeignID = $foreignObject->ID;
    $em->persist($aObject);
    $em->flush();
});

我遇到了完整性约束违规行为:

  

外键约束失败(dbName.A,CONSTRAINT A_ForeignID FOREIGN KEY(ForeignID)REFERENCES ForeignTableID)ON DELETE NO ACTION ON UPDATE NO ACTION) < / p>

我的猜测是在提交之前检查约束,并且它不检查我做的那个尚未提交的插入是否可以使约束通过而不是失败。但我确实希望这两个插入语句包含在同一个事务中。那我该怎么办?

更新

我将$em->persist($aObject); $em->flush();移出了交易,我仍然遇到同样的错误。显然,我猜错了......但后来我真的不知道是什么导致错误。


SQL上下文

A

CREATE TABLE `A` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  `ForeignID` int(11) NOT NULL,
  PRIMARY KEY (`ID`),
  KEY `A_ForeignID` (`ForeignID`),
  CONSTRAINT `A_ForeignID` FOREIGN KEY (`ForeignID`) REFERENCES `ForeignTable` (`ID`) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci

ForeignTable

CREATE TABLE `ForeignTable` (
  `ID` int(11) NOT NULL AUTO_INCREMENT,
  PRIMARY KEY (`ID`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_swedish_ci

2 个答案:

答案 0 :(得分:1)

我建议阅读关于MySQL数据完整性和FKs,然后Doctrine associations,MySQL检查InnodDB表的数据完整性。你做的不对,应该是

$entityManager->transactional(function($em) {
    $foreignObject = new DoctrineEntities\ForeignTable();
    $em->persist($foreignObject);

    $aObject = new DoctrineEntities\A();
    $aObject->setForeign($foreignObject);
    $em->persist($aObject);

    $em->flush();
});

答案 1 :(得分:0)

我解决了这个问题。这是与我的问题完全无关的其他地方..我会接受hermes答案,因为接受这个答案真的不会帮助其他任何人......