删除带有外键 Laravel 错误的列:一般错误:1025 重命名错误

新手上路,请多包涵

我使用迁移创建了一个表,如下所示:

 public function up()
{
    Schema::create('despatch_discrepancies',  function($table) {
        $table->increments('id')->unsigned();
        $table->integer('pick_id')->unsigned();
        $table->foreign('pick_id')->references('id')->on('picks');
        $table->integer('pick_detail_id')->unsigned();
        $table->foreign('pick_detail_id')->references('id')->on('pick_details');
        $table->integer('original_qty')->unsigned();
        $table->integer('shipped_qty')->unsigned();
    });
}

public function down()
{
    Schema::drop('despatch_discrepancies');
}

我需要更改此表并删除外键引用和列 pick_detail_id 并在 之后添加一个名为 sku pick_id 新 varchar 列。

因此,我创建了另一个迁移,如下所示:

 public function up()
{
    Schema::table('despatch_discrepancies', function($table)
    {
        $table->dropForeign('pick_detail_id');
        $table->dropColumn('pick_detail_id');
        $table->string('sku', 20)->after('pick_id');
    });
}

public function down()
{
    Schema::table('despatch_discrepancies', function($table)
    {
        $table->integer('pick_detail_id')->unsigned();
        $table->foreign('pick_detail_id')->references('id')->on('pick_details');
        $table->dropColumn('sku');
    });
}

当我运行此迁移时,我收到以下错误:

[照亮\数据库\查询异常]

SQLSTATE [HY000]:一般错误:1025 将“./dev_iwms_reboot/despatch_discrepancies”重命名为“./dev_iwms_reboot/#sql2-67c-17c464”时出错(错误号:152)(SQL:alter table despatch_discrepancies 删除外键 pick_detail_id)

[PDO异常]

SQLSTATE [HY000]:一般错误:1025 将“./dev_iwms_reboot/despatch_discrepancies”重命名为“./dev_iwms_reboot/#sql2-67c-17c464”时出错(错误号:152)

当我尝试通过运行 php artisan migrate:rollback 命令来反转此迁移时,我收到一条 Rolled back 消息,但它实际上并没有在数据库中执行任何操作。

知道可能出了什么问题吗?如何删除具有外键引用的列?

原文由 Latheesan 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 474
2 个回答

事实证明;当您创建这样的外键时:

 $table->integer('pick_detail_id')->unsigned();
$table->foreign('pick_detail_id')->references('id')->on('pick_details');

Laravel 唯一地命名外键引用,如下所示:

 <table_name>_<foreign_table_name>_<column_name>_foreign
despatch_discrepancies_pick_detail_id_foreign (in my case)

因此,当您要删除具有外键引用的列时,您必须这样做:

 $table->dropForeign('despatch_discrepancies_pick_detail_id_foreign');
$table->dropColumn('pick_detail_id');

更新:

Laravel 4.2+ 引入了一个新的命名约定:

 <table_name>_<column_name>_foreign

更新:

Larave > 8.x 引入了一个新功能

dropConstrainedForeignId('pick_detail_id');

这将删除列以及列的外键

原文由 Latheesan 发布,翻译遵循 CC BY-SA 4.0 许可协议

在 laravel 8 上使用 dropConstrainedForeignId ( https://github.com/laravel/framework/pull/34806 )

 <?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class AddAddressFieldsInEventTable extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {

        Schema::table('events', function (Blueprint $table) {
            $table->bigInteger('address_id')->nullable();

            $table->foreign('address_id')
                ->references('id')
                ->on('addresses')
                ->onDelete('cascade');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::table('events', function (Blueprint $table) {
            $table->dropConstrainedForeignId('address_id');
            $table->dropColumn('address_id');
        });
    }
}

原文由 Filipe Mansano 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题