学说迁移:向现有表添加和删除两个外键列不起作用

Posted

技术标签:

【中文标题】学说迁移:向现有表添加和删除两个外键列不起作用【英文标题】:Doctrine migration: adding and removing two foreign key columns to existing table is not working 【发布时间】:2015-02-15 13:46:18 【问题描述】:

我有现有的表 pricing,在迁移脚本上我想添加两个新列 pricing_set_idcoe_id,它们都是外键。

up 函数上,它运行完美,没有任何错误,但是当我运行down 函数时,它得到了错误。我的代码如下。

开启up功能:

$pricingTable = $schema->getTable('pricing');
$pricingSetTable = $schema->getTable('pricing_set');

if (!$pricingTable->hasColumn('pricing_set_id')) 
    $pricingTable->addColumn('pricing_set_id', 'uuid')->setNotnull(false);


if (!$pricingTable->hasIndex('FK_pricing_set_idx')) 
    $pricingTable->addIndex(['pricing_set_id'], 'FK_pricing_set_idx');


if (!$pricingTable->hasForeignKey('FK_pricing_set')) 
    $pricingTable->addForeignKeyConstraint($pricingSetTable,
        ['pricing_set_id'],
        ['id'],
        ['onUpdate' => 'CASCADE', 'onDelete' => 'CASCADE'],
        'FK_pricing_set');


if (!$pricingTable->hasColumn('coe_id')) 
    $pricingTable->addColumn('coe_id', 'uuid')->setNotnull(false);


if (!$pricingTable->hasIndex('FK_pricing_coe_idx')) 
    $pricingTable->addIndex(['coe_id'], 'FK_pricing_coe_idx');


if (!$pricingTable->hasForeignKey('FK_pricing_coe')) 
    $pricingTable->addForeignKeyConstraint($schema->getTable('user'),
        ['coe_id'],
        ['id'],
        ['onUpdate' => 'CASCADE','onDelete' => 'CASCADE'], 
        'FK_pricing_coe');    

开启down功能:

$pricingTable = $schema->getTable('pricing');

if ($pricingTable->hasForeignKey('FK_pricing_set')) 
    $pricingTable->removeForeignKey('FK_pricing_set');


if ($pricingTable->hasColumn('pricing_set_id')) 
    $pricingTable->dropColumn('pricing_set_id');


if ($pricingTable->hasIndex('FK_pricing_set_idx')) 
    $pricingTable->dropIndex('FK_pricing_set_idx');


if ($pricingTable->hasForeignKey('FK_pricing_coe')) 
    $pricingTable->removeForeignKey('FK_pricing_coe');


if ($pricingTable->hasColumn('coe_id')) 
    $pricingTable->dropColumn('coe_id');


if ($pricingTable->hasIndex('FK_pricing_coe_idx')) 
    $pricingTable->dropIndex('FK_pricing_coe_idx');

我得到的错误:

 -> ALTER TABLE pricing DROP FOREIGN KEY FK_pricing_set
 -> DROP INDEX FK_pricing_set_idx ON pricing
 -> DROP INDEX FK_pricing_coe_idx ON pricing

迁移 20141031071812 在执行期间失败。错误执行“DROP INDEX FK_pricing_coe_idx ON 定价”时发生异常: SQLSTATE[HY000]:一般错误:1553 无法删除索引“FK_pricing_coe_idx”:在外键约束中需要。

我注意到 Doctrine 生成的 SQL 的顺序与 Doctrine 代码中预期的不完全相同。它删除索引FK_pricing_coe_idx 而不删除其外键。这可能是它出错的原因。

有什么办法可以解决这个问题吗?

【问题讨论】:

您使用的是哪个学说版本?更重要的是,哪个版本的学说用于生成迁移? @nem75:抱歉回复晚了,我们使用的是 Symfony 2.4,这意味着 Doctrine 版本在 2.2 左右 从这个问题来看github.com/doctrine/migrations/issues/83 我怀疑 Doctrine 2.2 可能会表现出你描述的行为。甚至可能是2.3。更新到最新的 Doctrine 版本(然后重新生成迁移)或手动编辑迁移可能是您最好的选择。 我没有在另一个迁移中分离第二个下降?可能并不理想,但可能会奏效。 【参考方案1】:

发生错误是因为在删除索引时 FK_pricing_coe 外键仍然存在。

【讨论】:

以上是关于学说迁移:向现有表添加和删除两个外键列不起作用的主要内容,如果未能解决你的问题,请参考以下文章

Java JPA双向ManyToOne映射不起作用

mysql 错误代码1217 MYSQL外键约束检查失败,删除或修改主表记录失败 怎么解决啊

Laravel 外键 onDelete('cascade') 不起作用

迁移后在 Django 上更改 db_table 不起作用,并且添加用户 (AbstractUser) 外键会破坏 __str__()

使用连接表返回结果的学说不起作用 Symfony2

Postgres - 级联删除不起作用