Data-fixtures: 使用外键截断表失败

创建于 2011-06-12  ·  25评论  ·  资料来源: doctrine/data-fixtures

当我调用 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?

最有用的评论

这是让它与 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)

所有25条评论

使用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 上遇到这个问题吗? 还是只有我一个人?

你能在 TRUNCATE 之前做 foreign_key_checks=0 吗?

http://bugs.mysql.com/bug.php?id=58788

我也遇到这个问题

我和我的伙伴遇到了完全相同的问题,这确实发生在 MySQL 5.5 上,而 5.1 可以用外键截断表。 恢复到 DELETE 并不是一个优雅的解决方案,如前所述,auto_increment 键不重置。

如果可以为 mysql 5.5 提供像 foreign_key_checks=0 这样的修复程序会很好

http://bugs.mysql.com/bug.php?id=54678

这是让它与 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更改:

https://github.com/doctrine/dbal/pull/42

我的机器上的 MySQL 5.5.9 也有同样的问题,但是 dogbrain 的 hack 有所帮助。

我们可以集成此修复程序吗? 否则,每个人都必须手动添加它才能使其正常工作。

它不是一个“修复”,它是一个黑客。 我不会合并黑客。

好,可以。 然而,这是一个允许灯具工作的黑客,如果他们这样做会很好;)
如果无法合并,是否有修复方法? 否则有一个错误使这个包对很多人不可用(每次更新时都不需要不断地手动修改它的代码)

@beberlei?

我们可以恢复 91ff6eb 更改以解决此问题吗?

这样它就不会被黑客攻击。 这是在本期的第一篇文章中提出的。

我不确定我做得对,但是我有同样的问题。 我不知道我使用的是哪个版本,我已经用 composer 下载了

"require": {
    "doctrine/doctrine-fixtures-bundle": "dev-master"
},

无论如何,为了获得一个指标复位,我需要运行“学说:模式:降--force”,然后“学说:模式重装前更新--force:”。 否则我有同样的错误。 有人可以告诉我我做错了什么吗?
提前致谢。

我在运行最新版本的学说装置和 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.

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

peterrehm picture peterrehm  ·  19评论

ehibes picture ehibes  ·  8评论

peterrehm picture peterrehm  ·  12评论

JanMalte picture JanMalte  ·  4评论

mvar picture mvar  ·  12评论