4

我有一个使用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 ForeignTable( ID) ON DELETE NO ACTION ON UPDATE NO ACTION)

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

更新

$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

外表

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

2 回答 2

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();
});
于 2012-11-06T17:45:06.863 回答
0

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

于 2012-11-09T21:18:10.203 回答