1. ホーム
  2. php

[解決済み] 外部キーでカラムを削除する Laravelのエラーです。一般的なエラーです。1025 名前変更時のエラー

2022-05-15 02:59:36

質問

このようなマイグレーションでテーブルを作成しました。

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 という新しいvarcharカラムを追加します。 sku の後に pick_id のカラムになります。

そこで、別のマイグレーションを作成したところ、以下のようになりました。

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');
    });
}

このマイグレーションを実行すると、以下のエラーが発生します。

[IlluminateDatabase QueryException] が発生しました。

sqlstate[hy000]: 一般的なエラー。1025 Error on rename of './dev_iwms_reboot/despatch_discrepancies' から './dev_iwms_reboot/#sql2-67c-17c464' にリネームされました (errno: 152) (SQL: alter table despatch_discrepancies drop foreign key pick_detail_id)

[PDOException]が発生しました。

sqlstate[hy000]: 一般的なエラーです。1025 Error on rename of './dev_iwms_reboot/despatch_discrepancies' から './dev_iwms_reboot/#sql2-67c-17c464' にリネームされました (errno: 152)

このマイグレーションを元に戻すために php artisan migrate:rollback コマンドを実行すると Rolled back メッセージを受け取りますが、実際にはデータベースで何もしていません。

何が間違っているのか、何か思い当たることはありますか?外部キー参照を持つ列をどのようにドロップするのでしょうか?

どのように解決するのですか?

それは、このように外部キーを作成すると判明しました。

$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