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



我有一个使用原则 2 的 PHP 脚本,它基本上执行以下操作:

$entityManager->transactional(function($em) {
$foreignObject = new DoctrineEntitiesForeignTable();
$em->persist($foreignObject);
$em->flush();
$aObject = new DoctrineEntitiesA();
$aObject->ForeignID = $foreignObject->ID;
$em->persist($aObject);
$em->flush();
});

我收到完整性约束冲突:

外键约束失败(dbName.A,约束A_ForeignID外键 (ForeignID) 引用ForeignTable(ID) 删除时不更新任何操作)

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

更新

$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

我建议阅读有关MySQL数据完整性和FK的信息,然后是Doctrine关联,MySQL会检查InnodDB表的数据完整性。你正在做的事情是不对的,应该是

$entityManager->transactional(function($em) {
$foreignObject = new DoctrineEntitiesForeignTable();
$em->persist($foreignObject);
$aObject = new DoctrineEntitiesA();
$aObject->setForeign($foreignObject);
$em->persist($aObject);
$em->flush();
});

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

最新更新