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 tablesell_shipping_labelsadd constraintsell_shipping_labels_order_id_foreignforeign key(order_id)referencesorders(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
小智 13
外键必须是“ unsignedBigInteger”,并且将是固定的,如下所示:
$table->unsignedBigInteger('user_id');
$table->foreign('user_id')->references('id')->on('users');
Run Code Online (Sandbox Code Playgroud)
我也遇到了同样的错误。我在用户表中所做的是,
$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
最后它起作用了。也许有时你会遇到这个问题。所以,我发布了它。
主键和外键应具有相同的数据类型。
如果主键使用无符号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)
| 归档时间: |
|
| 查看次数: |
29126 次 |
| 最近记录: |