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)
私の推測では、制約はコミットの前にチェックされ、まだコミットされていない挿入が失敗するのではなく、成功する可能性があるかどうかはチェックされません。しかし、私は本当にこれら2つの挿入ステートメントを同じトランザクションでラップしたいと思っています。それで、なにかお手伝いできますか?
アップデート
$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