我正在尝试使用迁移删除外键。
这是我的代码
public function up()
{
Schema::table('tbl_social_media_links', function (Blueprint $table) {
$table->renameColumn('vchr_link', 'vchr_social_media_link');
$table->dropColumn('vchr_social_media_name');
$table->integer('fk_int_business_id')->unsigned()->after('pk_int_sm_id');
$table->foreign('fk_int_business_id')->references('pk_int_business_id')
->on('tbl_business_details')->onDelete('cascade');
$table->integer('int_social_media_type')->after('fk_int_business_id');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('tbl_social_media_links', function (Blueprint $table) {
Schema::disableForeignKeyConstraints();
$table->string('vchr_social_media_name')->after('pk_int_sm_id');
$table->dropColumn('fk_int_business_id');
$table->dropColumn('int_social_media_type');
$table->renameColumn('vchr_social_media_link', 'vchr_link');
Schema::enableForeignKeyConstraints();
});
}
也尝试过 $table->dropForiegn('fk_int_business_id');
我不断收到类似错误
General error: 1553 Cannot drop index 'tbl_social_media_links_fk_int_business_id_foreign': needed in a foreign key constraint (
SQL: alter table `tbl_social_media_links` drop `fk_int_business_id`)
有人可以帮我让它工作吗?
我什至尝试使用 sql 删除它,但它说
无法删除“fk_int_business_id”;检查列/键是否存在
最佳答案
这就是我要做的:
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('tbl_social_media_links', function (Blueprint $table) {
$table->foreign('fk_int_business_id')
->references('pk_int_business_id')
->on('tbl_business_details')
->onDelete('cascade');;
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('tbl_social_media_links', function (Blueprint $table) {
$table->dropForeign(['fk_int_business_id']);
});
}
请注意,我在 dropForeign
中使用字符串数组作为参数而不是字符串进行发送,因为行为不同。对于数组,您可以使用列名称,但对于字符串,您需要使用键名称。
但是,我发现,即使删除外键,索引键仍然存在,所以这可以解决这个问题:
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('tbl_social_media_links', function (Blueprint $table) {
$table->foreign('fk_int_business_id')
->references('pk_int_business_id')
->on('tbl_business_details')
->onDelete('cascade');;
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('tbl_social_media_links', function (Blueprint $table) {
$index = strtolower('tbl_social_media_links'.'_'.implode('_', ['fk_int_business_id']).'_foreign');
$index = str_replace(['-', '.'], '_', $index);
$table->dropForeign($index);
$table->dropIndex($index);
});
}
另请注意,在本例中,我生成键名称而不是使用数组,因为我找不到任何其他方法来仅使用列名称删除索引键。
另一方面,请注意您可能需要拆分语句才能删除该列:
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('tbl_social_media_links', function (Blueprint $table) {
$index = strtolower('tbl_social_media_links'.'_'.implode('_', ['fk_int_business_id']).'_foreign');
$index = str_replace(['-', '.'], '_', $index);
$table->dropForeign($index);
$table->dropIndex($index);
});
Schema::table('tbl_social_media_links', function (Blueprint $table) {
$table->dropColumn('fk_int_business_id');
});
}
关于mysql - 在 Laravel 中删除外键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49334545/