27

私は注文テーブルを持っており、外部としてsell_shipping_labels参照しています。orders.idただし、Laravel の移行を実行すると、恐ろしいエラー コードが表示されます。

[Illuminate\Database\QueryException]
SQLSTATE[HY000]: 一般エラー: 1005 テーブルを作成できませんcheapbooks_test#sql-b5b_b2a(errno: 150 "外部キー制約の形式が正しくありません") (SQL: alter table sell_shipping_labelsadd constraint Foreign key sell_shipping_labels_order_id_foreign( order_id) references orders( id))

[Doctrine\DBAL\Driver\PDOException]
SQLSTATE[HY000]: 一般エラー: 1005 テーブルを作成できませんcheapbooks_test#sql-b5b_b2a(エラー番号: 150 "外部キー制約の形式が正しくありません")

これは私のordersテーブルスキーマです:

   Schema::create('orders', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('user_id');
        $table->integer('book_id');
        $table->integer('status_id');
        $table->double('payment_amount')->nullable();
        $table->timestamp('received_at')->nullable();
        $table->timestamp('paid_at')->nullable();
        $table->timestamps();
        $table->softDeletes();
    });

そして、これは私のsell_shipping_labelsスキーマです:

Schema::create('sell_shipping_labels', function (Blueprint $table) {
        $table->increments('id');
        $table->unsignedInteger('order_id');
        $table->string('shippo_object_id');
        $table->string('label_url');
        $table->string('tracking_url');
        $table->string('tracking_number');
        $table->timestamp('arrived_at');
        $table->timestamps();
        $table->softDeletes();

        $table->foreign('order_id')->references('id')->on('orders');
    });
}

今、私は問題を理解しようとして、インターネットをひっくり返しました。この問題に関する投稿はすべて、外部キーを持つテーブルの前に注文テーブルを作成する必要があるという事実に言及してますが、ファイルが正しい順序になっているため、これは問題ではありません。

4

21 に答える 21

61

increments()符号なし整数列を作成するため、外部キー列も符号なし整数として定義する必要があります。

Laravel 6+ のデフォルトの移行ではが使用されるため、次のメソッドbigIncrements()を使用する必要があります。unsignedBigInteger()

$table->unsignedBigInteger('order_id');

https://laravel.com/docs/6.x/migrations#foreign-key-constraints

古いバージョンの Laravel でのデフォルトの移行には、次のunsignedInteger()方法を使用します。

$table->unsignedInteger('order_id');

または:

$table->integer('order_id')->unsigned();

https://laravel.com/docs/5.5/migrations#foreign-key-constraints

于 2017-12-09T13:11:27.177 に答える
4

ほとんどの場合、このエラーの理由は通常、移行ファイルがリストされている順序または型キャストによるエラーが原因です。

外部制約が課されるファイルの移行が、親の移行の後に行われることを常に確認してください。後者の場合は、それが unsignedBigIntegerであることを確認してください。ただし、laravel の以前のバージョン (<5.4) では、この型キャスト エラーを無視できます。

于 2019-10-16T16:12:09.473 に答える