【问题标题】:Laravel 5.2 drop foreign keyLaravel 5.2 删除外键
【发布时间】: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() 之外的外键之前添加一些特殊的东西?

标签: php mysql laravel-5.2


【解决方案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() 造成了麻烦。谢谢你的帮助:)
猜你喜欢
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 2016-12-16
  • 2018-03-10
  • 2017-03-18
  • 1970-01-01
  • 1970-01-01
  • 2017-01-28
相关资源
最近更新 更多