Laravel 在迁移中删除外键

Posted

技术标签:

【中文标题】Laravel 在迁移中删除外键【英文标题】:Laravel drop foreign Key in Migration 【发布时间】:2019-01-22 10:48:15 【问题描述】:

我想创建一个删除表的迁移。我像这样创建了迁移:

Schema::table('devices', function (Blueprint $table) 
    $table->increments('id');
    $table->unsignedInteger('client_id')->nullable();
    $table->foreign('client_id')->references('id')->on('clients')->onDelete('cascade');
);

现在我尝试像这样删除它:

    Schema::table('devices', function (Blueprint $table) 
        $table->dropForeign('devices_client_id_foreign');
        $table->drop('devices');
    );

但我收到以下错误:

In Connection.php line 664:

  SQLSTATE[42000]: Syntax error or access violation: 1091 Can't DROP 'devices_client_id_foreign'; check that column/key exists (SQL:

alter table devices drop foreign key devices_client_id_foreign)

In PDOStatement.php line 144:

  SQLSTATE[42000]: Syntax error or access violation: 1091 Can't DROP 'devices_client_id_foreign'; check that column/key exists


In PDOStatement.php line 142:

  SQLSTATE[42000]: Syntax error or access violation: 1091 Can't DROP 'devices_client_id_foreign'; check that column/key exists

【问题讨论】:

【参考方案1】:

您可以使用此答案。 https://***.com/a/30177480/8513937

将列名作为数组传递给 dropForeign。在内部,Laravel 删除了关联的外键。

$table->dropForeign(['client_id']);

【讨论】:

当你没有给它一个 Laravel 默认设置的不同的 FK 名称时,这可以工作。【参考方案2】:

您只需要在删除表之前禁用外键检查,然后像这样再次启用它们:

DB::statement('SET FOREIGN_KEY_CHECKS=0;');
Schema::dropIfExists('devices');
DB::statement('SET FOREIGN_KEY_CHECKS=1;');

【讨论】:

【参考方案3】:

试试这个方法...

  public function down()
 
    Schema::dropIfExists('devices');
 

//Or this
  public function down()
    Schema::table('devices', function (Blueprint $table) 
        $table->dropForeign(['client_id']);
        $table->dropColumn('client_id');
        $table->drop('devices');
    );
  

【讨论】:

有一个外键我放不下它【参考方案4】:

只需删除整个表格 (documentation):

Schema::drop('devices');

【讨论】:

嗨,有一个外键 Client_id,所以我不能轻易放弃它 Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails (SQL: drop table devices) 其他表中是否存在引用devices表的外键? 当我们不在 up 方法中创建表时,为什么要在 down 方法中删除整个表? 当它有一个外键时,你不能删除整个表。

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

Laravel 5.2 删除外键

如何在 Laravel 迁移中创建自引用关系(外键)?

如何在laravel迁移中编辑原始表?

Eloquent - 如果外键有行,则防止删除数据 - Laravel

Laravel 4迁移问题中的外键

迁移问题:无法在laravel中添加外键约束