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

cuo*_*gle 7 php mysql doctrine doctrine-orm

我有现有的表pricing,在迁移脚本上我想添加两个新列pricing_set_id,coe_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');    
}
Run Code Online (Sandbox Code Playgroud)

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');
}
Run Code Online (Sandbox Code Playgroud)

我得到的错误:

 -> 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
Run Code Online (Sandbox Code Playgroud)

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

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

有没有办法解决这个问题?

anu*_*hal 1

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