当我调用 symfony CLI 命令时:
php app/console doctrine:fixtures:load
我得到
[PDOException]
SQLSTATE[42000]: Syntax error or access violation: 1701 Cannot truncate a table referenced in a foreign key constraint (symfony.param_product, CONSTRAINT param_product_ibfk_1 FOREIGN KEY (param_val_id) REFERENCES symfony.param_value (id))
表 symfony.param_product 由@ORM\JoinTable 注释(使用@ORM\ManyToMany)创建。 我正在使用 MySQL
在此更改之前,这工作正常:91ff6ebbb781441c60782d90a4dd95482eeedf35
我认为这可能是我这边的错误(例如没有 onDelete 选项)但我尝试的一切都失败了。
据我了解,例如从http://forums.asp.net/t/1283840.aspx/1?How+can+I+truncate+the+table+which+have+foreign+key+
ON DELETE CASCADE is true only for deleting records and not for truncating tables.
You have to drop the foreign key constraint from Child Table that references the Master Table to be truncated, then after only you are able to truncate the Master Table.
所以在我看来唯一的解决方案是使用 DELETE 或先删除外键。
我们可以恢复 91ff6ebbb781441c60782d90a4dd95482eeedf35 更改以解决此问题吗? @beberlei?
使用DELETE
是它不会重置自动增量值
好的,但是TRUNCATE
的问题在于dotric:fixtures :load 命令不起作用。
如果真的需要,总是可以通过删除和重新创建表来从 1 开始自动递增,对吗?
是的 - 我也有这个问题。 现在回滚到 91ff6ebbb781441c60782d90a4dd95482eeedf35。
+1 用于恢复 91ff6ebbb781441c60782d90a4dd95482eeedf35
为什么不直接在 TRUNCATE 中添加“CASCADE”? $platform->getTruncateTableSQL($tbl) 有第二个参数,它会返回类似“TRUNCATE table CASCADE”的东西(至少对于 postgres 是这样)并且它可以工作。
添加拉取请求怎么样? 那我就可以合并了。
@leahaense
使用 MySQL 时问题仍然存在(即使在 4a8464ef83093de2378cef2770e13da7e4858ffc 之后)。
在这种情况下,您的外键是双向的还是什么?
@beberlei是的,我想是的。 我不是 100% 确定 SQL 是由 Doctrine 从一对多/多对多注释(是的,是双向的)生成的。
还有其他人在 MySQL 上遇到这个问题吗? 还是只有我一个人?
我和我的伙伴遇到了完全相同的问题,这确实发生在 MySQL 5.5 上,而 5.1 可以用外键截断表。 恢复到 DELETE 并不是一个优雅的解决方案,如前所述,auto_increment 键不重置。
如果可以为 mysql 5.5 提供像 foreign_key_checks=0 这样的修复程序会很好
这是让它与 MySQL 5.5 一起工作的快速肮脏的黑客
diff --git a/lib/Doctrine/Common/DataFixtures/Purger/ORMPurger.php b/lib/Doctrine/Common/DataFixtures/Purger/ORMPurger.php
index a580c1f..ff758c1 100644
--- a/lib/Doctrine/Common/DataFixtures/Purger/ORMPurger.php
+++ b/lib/Doctrine/Common/DataFixtures/Purger/ORMPurger.php
@@ -82,10 +82,12 @@ class ORMPurger implements PurgerInterface
$orderedTables[] = $class->getTableName();
}
+ $this->em->getConnection()->executeUpdate("SET foreign_key_checks = 0;");
$platform = $this->em->getConnection()->getDatabasePlatform();
foreach($orderedTables as $tbl) {
$this->em->getConnection()->executeUpdate($platform->getTruncateTableSQL($tbl, true));
}
+ $this->em->getConnection()->executeUpdate("SET foreign_key_checks = 1;");
}
private function getCommitOrder(EntityManager $em, array $classes)
上述修复对我来说非常有用。 什么时候可以将修复程序引入 repo 以便我不必一直手动更改它?
我还必须添加此修复程序才能使用捆绑包。
以上为我修复了它(据我所知,仍在学习 Doctrine/Symfony2)
在@mdarse提交拉取请求几分钟后,我对 DBAL 项目本身的 MySqlPlatform 进行了foreign_key_checks
更改:
我的机器上的 MySQL 5.5.9 也有同样的问题,但是 dogbrain 的 hack 有所帮助。
我们可以集成此修复程序吗? 否则,每个人都必须手动添加它才能使其正常工作。
它不是一个“修复”,它是一个黑客。 我不会合并黑客。
好,可以。 然而,这是一个允许灯具工作的黑客,如果他们这样做会很好;)
如果无法合并,是否有修复方法? 否则有一个错误使这个包对很多人不可用(每次更新时都不需要不断地手动修改它的代码)
@beberlei?
我们可以恢复 91ff6eb 更改以解决此问题吗?
这样它就不会被黑客攻击。 这是在本期的第一篇文章中提出的。
我在运行最新版本的学说装置和 Mysql 5.5 时遇到了同样的问题。 “hack”有效,但这不是便携式解决方案。 我每次都必须删除架构并重新创建它。
帮自己一个忙,在 Symfony 文件夹中创建一个脚本,如load_fixtures
:
bin/console doc:sc:drop --force
bin/console doc:sc:cr
bin/console doc:fix:lo --no-interaction
运行chmod 755 load_fixtures
然后./load_fixtures.
最有用的评论
这是让它与 MySQL 5.5 一起工作的快速肮脏的黑客