Laravel 5.2删除外键

时间:2016-09-08 14:56:29

标签: php mysql laravel-5.2

美好的一天,

我试图在之前实现的Laravel 5.2迁移中删除一个外键:

编辑:在表中创建id(在使用外键之前)是:

$table->integer('agent_rights_id')->unsigned()->nullable();

外键:

Schema::table('agents', function (Blueprint $table){
        $table->foreign('agent_rights_id')->references('id')->on('agent_rights');
    });

我的下落看起来像这样:

 Schema::table('agents', function (Blueprint $table){
        $table->dropForeign('agents_agent_rights_id_foreign');
        $table->dropColumn('agent_rights_id');
    });

我发现,必须采取真实的"索引名称而不是标签 - 这是我在前面的代码段中已经考虑过的(作为对this question的引用)。

但这给了我错误:

[Illuminate\Database\QueryException]                                                                                                                                                                                          
SQLSTATE[HY000]: General error: 1025 Error on rename of './{name}/agents' to './{name}/#sql2-2a6-1d8' (errno: 152) (SQL: alter table `agents` drop foreign key `agents_agent_rights_id_foreign`)  



[PDOException]                                                                                                                                  
SQLSTATE[HY000]: General error: 1025 Error on rename of './{name}/agents' to './{name}/#sql2-2a6-1d8' (errno: 152) 

研究这个没有真正的解决方案,只有来自MySQL的bug消息......

问题:你们有什么关于这件事,或者我的代码片段出了什么问题?

1 个答案:

答案 0 :(得分:2)

@Mentenyia在创建外键约束之前,必须使用unsigned()。请阅读https://laravel3.veliovgroup.com/docs/database/schema#foreign-keys链接。

  

注意:外键中引用的字段很可能是auto   递增,因此自动为无符号整数。请做出来   一定要使用unsigned()创建外键字段作为两个字段   必须是完全相同的类型,两个表上的引擎必须是   设置为InnoDB,并且必须在之前创建引用的表   带外键的表。

所以你必须这样创建:

$table->integer('agent_rights_id')->unsigned(); // Always create column before creating Foreign key constraint otherwise this will also give error.
$table->foreign('agent_rights_id')->references('id')->on('agent_rights');

您将要删除外键之后不会出现问题/错误。

  

用于删除索引使用此方法 table-name_column-name_index-type

$table->dropForeign('agents_agent_rights_id_foreign');