Doctrine 重新创建相同的索引

问题描述 投票:0回答:3

当我运行学说模式更新时,我收到了需要执行的奇怪查询,但它们基本上只是重做已经完成或尚未完成的操作?

php app/console doctrine:schema:update --dump-sql 


DROP INDEX idx_26d7e8feab772a3c ON notify;
CREATE INDEX IDX_217BEDC8AB772A3C ON notify (notifyUser_id);
DROP INDEX idx_26d7e8fea76ed395 ON notify;
CREATE INDEX IDX_217BEDC8A76ED395 ON notify (user_id);
DROP INDEX idx_26d7e8fe6bf700bd ON notify;
CREATE INDEX IDX_217BEDC86BF700BD ON notify (status_id);


    "require": {
    "php": ">=5.3.3",
    "symfony/symfony": "~2.5.3",
    "doctrine/orm": "~2.2,>=2.2.3",
    "doctrine/doctrine-bundle": "~1.2",
    "gedmo/doctrine-extensions": "2.3.*@dev",
    "stof/doctrine-extensions-bundle": "~1.1@dev",
},

此行为阻止我使用 --force 更新学说模式,因为存在外键,并且我收到此错误:

[PDOException]                                                                        
  SQLSTATE[HY000]: General error: 1553 Cannot drop index 'IDX_A37CA197A76ED395': neede  
  d in a foreign key constraint

这可能是在过去更新数据库相关供应商之后开始发生的,但直到现在我才注意到。

symfony doctrine-orm
3个回答
7
投票

@theapprenticecoder @Trki 这个问题可以通过命令解决

$ app/console doctrine:schema:update --force --complete

这是最好的解决方案。


0
投票

我可以向您确认,这可能是在您升级教义供应商时发生的。

这个问题已在doctrine/dbal 2.5.1版本中修复。

您需要做的就是安装 v2.5.1 的doctrine/dbal 依赖项。 然后只需执行“php app/console 学说:schema:update --force”,您的问题就会得到解决...


0
投票

我知道这是一个老问题,但没有一个答案对我有帮助。在Github上

@binarious
的评论中找到了解决方案:https://github.com/doctrine/dbal/issues/3419#issuecomment-709296661

回顾一下问题

我在 DBAL 4.0.xDoctrine 3.2.x(使用 Symfony 7 框架)中得到相同的行为:运行

bin/console doctrine:schema:update --force
时,它总是更新我的数据库,即使在此期间没有任何更改。

原因: 如果您的班级有一个索引,该索引使用带有

type: Types::TEXT
的列,您很可能会遇到同样的问题。

这是一个“错误”的类:

<?php

// ...

use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
#[ORM\Index(name: 'name_de', columns: ['name_de'])]
class InformationSource
{
    //                   ,------------- problem
    //                  /
    //                 v
    #[ORM\Column(type: Types::TEXT)]
    public string $nameDe;

// ...
}

解决方案

为索引中使用的每一列设置固定长度。 Doctrine 会识别它,并且一旦正确创建索引就不会尝试重新创建索引。

<?php

// ...

use Doctrine\DBAL\Types\Types;
use Doctrine\ORM\Mapping as ORM;

#[ORM\Entity]
#[ORM\Index(name: 'name_de', columns: ['name_de'])]
class InformationSource
{
    //                   ,------------- fixed
    //                  /
    //                 v
    #[ORM\Column(length: 255)]
    public string $nameDe;

// ...
}
© www.soinside.com 2019 - 2024. All rights reserved.