【问题标题】:Generate Database MyISAM Doctrine 2生成数据库 MyISAM 学说 2
【发布时间】:2016-01-01 14:33:21
【问题描述】:

我正在使用 Doctrine 根据我的实体生成和更新我的数据库。此外,我在我的桌子上使用了 MyISAM 引擎。为此,我添加了如下注释:

/** (...) @ORM\Table(name="user",options={"engine":"MyISAM", "charset"="utf8"}) */

这些表通常是作为 MyISAM 生成的,但是当我现在尝试更新它们时,学说正在尝试生成 FK。然后我得到了:

 General error: 1215 Cannot add foreign key constraint

我知道 MyISAM 不支持 FK,有没有办法告诉学说跳过创建 FK?

我同时使用 orm:schema-tools:update(在 DEV 中)和 迁移(在 PROD 中)。我也在使用zf2。

【问题讨论】:

    标签: php mysql doctrine-orm innodb myisam


    【解决方案1】:

    基于this thread,我提出了一个解决方案。

    我为 EM 添加了一个事件监听器。

    $em->getEventManager()->addEventSubscriber(new DropForeignKeysListener());
    

    此事件从注释生成的架构中删除所有 FK,如下所示:

    use Doctrine\Common\EventSubscriber;
    use Doctrine\ORM\Tools\ToolEvents;
    use Doctrine\ORM\Tools\Event\GenerateSchemaEventArgs;
    
    class DropForeignKeysListener implements EventSubscriber
    {
        public function postGenerateSchema(GenerateSchemaEventArgs $args) {
            $schema = $args->getSchema();
    
            $table_names = $schema->getTableNames();
            foreach ($table_names as $table_name) {
                $table = $schema->getTable($table_name);
                $fks = $table->getForeignKeys();
    
                foreach ($fks as $fk => $obj) {
                    $table->removeForeignKey($fk);
                }
            }
        }
    
        public function getSubscribedEvents() {
            return array(ToolEvents::postGenerateSchema);
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      MyISAM 存储引擎不支持行级锁定、外键,甚至不支持事务。查看this question 以获得更详细的答案。

      如果您没有任何特定且正当的理由使用 MyISAM,我强烈建议您改用 InnoDB。

      您可能还想阅读此comparison between InnoDB and MyISAM

      【讨论】:

      • 我知道它不支持 FK(我可能没有在问题中说清楚),我只是想在尝试更新数据库时避免创建。否则我必须转储 SQL 并手动删除创建语句。我也可以改变它,但现在即使我这样做了,我也会一直好奇我应该如何避免它。例如,现在我正在考虑使用像这里这样的事件订阅者:Telling Schema-Tool to ignore an entity。这更接近我正在寻找的答案。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-08-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多