学说迁移:向现有表添加和删除两个外键列不起作用
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_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');
开启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 外键仍然存在。
【讨论】:
以上是关于学说迁移:向现有表添加和删除两个外键列不起作用的主要内容,如果未能解决你的问题,请参考以下文章
mysql 错误代码1217 MYSQL外键约束检查失败,删除或修改主表记录失败 怎么解决啊
Laravel 外键 onDelete('cascade') 不起作用
迁移后在 Django 上更改 db_table 不起作用,并且添加用户 (AbstractUser) 外键会破坏 __str__()