Laravel迁移(错误:150"外键约束形成错误")

Fre*_*sty 13 mysql laravel laravel-5 artisan artisan-migrate

我有一个订单表和一个sell_shipping_labels引用orders.id作为外国的.但是,当我运行Laravel迁移时,我得到了可怕的错误代码:

[Illuminate\Database\QueryException]
SQLSTATE [HY000]:常规错误:1005无法创建表cheapbooks_test.#sql-b5b_b2a(错误:150"外键约束形成错误")(SQL:alter table sell_shipping_labelsadd constraint sell_shipping_labels_order_id_foreignforeign key(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();
    });
Run Code Online (Sandbox Code Playgroud)

这是我的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');
    });
}
Run Code Online (Sandbox Code Playgroud)

现在我已经颠倒了互联网,试图找出问题所在.关于这个问题的所有帖子都指的是必须在具有外键的表之前创建订单表,但这对我来说不是问题,因为我的文件的顺序正确.

Ale*_*nin 27

由于increments()创建了无符号整数列,因此您还需要将外键列定义为无符号整数:

$table->unsignedInteger('order_id');
Run Code Online (Sandbox Code Playgroud)

要么:

$table->integer('order_id')->unsigned();
Run Code Online (Sandbox Code Playgroud)

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

  • $table->unsignedBigInteger('order_id'); 这对我有用。谢谢 (2认同)

小智 13

外键必须是“ unsignedBigInteger”,并且将是固定的,如下所示:

$table->unsignedBigInteger('user_id');

$table->foreign('user_id')->references('id')->on('users');
Run Code Online (Sandbox Code Playgroud)


Ana*_*ali 8

我也遇到了同样的错误。我在用户表中所做的是,

$table->unsignedInteger('role_id')->default(2); table->foreign('role_id')->references('id')->on('roles')->onDelete('cascade');

但是我在创建用户表后创建了角色表。因此,我在用户表文件名日期之前编辑了角色迁移文件名日期。像这样,

2013_01_22_091213_create_roles_table.php
2014_10_12_000000_create_users_table.php

最后它起作用了。也许有时你会遇到这个问题。所以,我发布了它。


Nur*_*uda 8

主键和外键应具有相同的数据类型

如果主键使用无符号big_integer,则外键也应使用无符号big_integer

如果laravel 5.8 bigIncrements默认情况下在生成新迁移时使用(请参阅此pull request),则应确保您foreign key也是, big_increment否则会出错。

users

Schema::create('users', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->string('name');

    ...

}
Run Code Online (Sandbox Code Playgroud)

orders

Schema::create('orders', function (Blueprint $table) {
    $table->bigIncrements('id');
    $table->unsignedBigInteger('user_id');

    ...

    $table->foreign('user_id')->references('id')->on('users');
}
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。


小智 5

Laravel 5.8.3随附 $table->bigIncrements('id');

更改为

$table->increments('id');
$table->integer('order_id')->unsigned();
Run Code Online (Sandbox Code Playgroud)