Laravel 5.2 删除外键

Posted

技术标签:

【中文标题】Laravel 5.2 删除外键【英文标题】:Laravel 5.2 drop foreign key 【发布时间】:2017-01-16 13:54:18 【问题描述】:

早安,

我正在尝试在以前这样实现的 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');
    );

我发现,必须使用“真实”索引名称而不是标签 - 我在之前的 sn-p 中已经想到了这一点(作为对 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 的错误消息......

问题:你们对此有何看法,或者我的 sn-p 出了什么问题?

【问题讨论】:

在我创建这篇文章之前,我做了这个问题中所说的。这不是同一个问题,因为我已经按照那里所说的做了。 你遗漏了一些东西,因为我在我的项目中运行了相同的东西并且它工作正常。无论如何,我删除重复并重新打开它。我还再次仔细检查了您的脚本。请参阅 Laravel 文档 laravel.com/docs/5.2/migrations。 你也可以传递一个数组值,当像$table->dropForeign(['agent_rights_id']);这样删除时会自动使用常规的约束名称 @Manish 我试过了,但遗憾的是同样的错误......我是否应该在列被设为除 unsigned() 之外的外键之前添加一些特殊的东西? 【参考方案1】:

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

注意:外键引用的字段很可能是自动的 递增,因此自动成为无符号整数。请做出来 确保使用 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');

【讨论】:

执行此操作时我仍然有错误,在 unsigned() 之后不使用 nullable() 时也是如此……但我会从头开始重新设置整个数据库来测试它。我会回答的:) 是 unsigned() 之后的 nullable() 造成了麻烦。谢谢你的帮助:)

以上是关于Laravel 5.2 删除外键的主要内容,如果未能解决你的问题,请参考以下文章

在 Laravel 5.2 中修改原生认证

laravel 5.2中一列上有2个外键

无法在 Laravel 5.2 中使用外键迁移

删除功能 Laravel 5.2

Laravel 5.2 删除功能给了我 NotFoundHttpException

如何在 laravel 5.2 中从 url 中删除 public