Laravel 迁移:无法添加外键约束

Posted

技术标签:

【中文标题】Laravel 迁移:无法添加外键约束【英文标题】:Laravel Migrations: Cannot add foreign key constraint 【发布时间】:2019-03-24 15:30:23 【问题描述】:

我正在尝试通过 Laravel 迁移向我的数据库表添加外键约束,但我总是收到如下错误:

Illuminate\Database\QueryException  :
SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint
(SQL: alter table `tasks` add constraint `tasks_task_list_id_foreign` foreign key (`task_list_id`) references `task_lists` (`id`))

tasks 表的迁移如下所示:

<?php

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

class CreateTasksTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::create('tasks', function (Blueprint $table) 
            $table->increments('id');
            $table->integer('user_id')->unsigned()->index();
            $table->integer('task_list_id')->unsigned()->index();
            $table->string('task');
            $table->timestamps();

            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
            $table->foreign('task_list_id')->references('id')->on('task_lists');
        );
    

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        Schema::dropIfExists('tasks');
    

这就是task_lists 表:

<?php

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

class CreateTaskListsTable extends Migration

    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    
        Schema::create('task_lists', function (Blueprint $table) 
            $table->increments('id');
            $table->integer('user_id')->unsigned()->index();
            $table->string('name');
            $table->timestamps();

            $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        );
    

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    
        Schema::dropIfExists('task_lists');
    

我无法找出问题所在,非常感谢任何形式的帮助。

提前谢谢你!

【问题讨论】:

您是先创建task_lists 表吗?两个表都使用InnoDB 引擎吗? 两者都使用InnoDBtask_lists 表是在tasks 表之后创建的。 你必须创建task_lists 之前 tasks 是的,我想这就是问题所在。说得通。但是如何更改订单? 您必须更改文件名中的日期。 【参考方案1】:

您必须检查迁移的顺序。显然,您必须在 Tasks 表迁移之前运行 de Users 表迁移。如果问题仍然存在,请尝试在 up() 方法内和 (Schemma::create) 之后进行类似操作:

    Schema::table('task_lists', function($table)
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    );

【讨论】:

以上是关于Laravel 迁移:无法添加外键约束的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 表迁移:无法添加外键约束

无法添加外键约束 - Laravel 迁移错误

Laravel 迁移 - 一般错误:1215 无法添加外键约束

Laravel 迁移 - 违反完整性约束:1452 无法添加或更新子行:外键约束失败

Laravel 5.3 迁移:1215 无法添加外键约束

MySQL数据库的Laravel迁移“无法添加外键约束”错误