美好的一天,
我试图在之前实现的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消息......
问题:你们有什么关于这件事,或者我的代码片段出了什么问题?
答案 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');