我使用迁移创建了一个表,如下所示:
public function up()
{
Schema::create('despatch_discrepancies', function($table) {
$table->increments('id')->unsigned();
$table->integer('pick_id')->unsigned();
$table->foreign('pick_id')->references('id')->on('picks');
$table->integer('pick_detail_id')->unsigned();
$table->foreign('pick_detail_id')->references('id')->on('pick_details');
$table->integer('original_qty')->unsigned();
$table->integer('shipped_qty')->unsigned();
});
}
public function down()
{
Schema::drop('despatch_discrepancies');
}
我需要更改此表,删除外键引用&列pick_detail_id
,并在pick_id
列之后添加一个名为sku
的新varchar列。
因此,我创建了另一个迁移,如下所示:
public function up()
{
Schema::table('despatch_discrepancies', function($table)
{
$table->dropForeign('pick_detail_id');
$table->dropColumn('pick_detail_id');
$table->string('sku', 20)->after('pick_id');
});
}
public function down()
{
Schema::table('despatch_discrepancies', function($table)
{
$table->integer('pick_detail_id')->unsigned();
$table->foreign('pick_detail_id')->references('id')->on('pick_details');
$table->dropColumn('sku');
});
}
运行此迁移时,出现以下错误:
[说明\数据库\查询异常]
SQL状态[HY 000]:一般错误:1025将.“/dev_iwms_reboot/调度差异”重命名为.“/dev_iwms_reboot/#sql2- 67 c-17 c464”时出错(错误号:152)(SQL:更改表despatch_discrepancies
删除外键pick_detail_id)
[PDO例外]
SQL状态[HY 000]:一般错误:1025将.“/dev_iwms_reboot/调度差异”重命名为.“/dev_iwms_reboot/#sql2- 67 c-17 c464”时出错(错误号:152)
当我尝试通过运行php artisan migrate:rollback
命令来反转此迁移时,我收到一条Rolled back
消息,但它实际上没有在数据库中执行任何操作。
你知道哪里出了问题吗?如何删除一个有外键引用的列?
8条答案
按热度按时间hof1towb1#
您可以使用此选项:
如果您在dropForeign source处取一个峰值,如果您将列名作为数组传递,它将为您构建外键索引名称。
nsc4cvqm2#
事实证明;当你创建一个如下的外键时:
Laravel将外键引用唯一命名为:
因此,当您要删除具有外键引用的列时,必须执行以下操作:
更新:
Laravel 4.2+引入了新的命名约定:
更新:
Larave〉8.x引入了一个新函数
这将删除该列及其外键
2j4z5cfb3#
我的表中有多个外键,然后我必须通过在down方法中传递列名作为数组的索引来逐个删除外键约束:
使用below语句无效
因为dropForeign不会将它们视为我们要删除的独立列。所以我们必须逐个删除它们。
watbbzwu4#
解决这个问题的关键(对我来说)是确保$table-〉dropForeign()命令传递的是正确的关系名,而不一定是列名。您不希望传递列名,这样会更直观。
对我有用的是:
因此,我传递给dropForeign()的字符串的格式为:
[本地表]_[外键字段]_foreign
如果你有机会使用像Sequel Pro或Navicat这样的工具,能够可视化这些将非常有帮助。
9nvpjoqh5#
我突然想到,我不知道把
Schema::table
块放在哪里。后来我才发现,关键是SQL上的错误:
因此,
Schema::table
块需要进入lu_benefits_categories
迁移的down()
函数中,并位于Schema::dropIfExists
行之前:在此之后,
php artisan migrate:refresh
或php artisan migrate:reset
就可以了。44u64gxh6#
在laravel 8上使用删除受约束的外部ID(https://github.com/laravel/framework/pull/34806)
31moq8wy7#
您可以先禁用关系标识
lnvxswe28#
在Larave中〉8.x
添加
跌落