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

Posted

技术标签:

【中文标题】Laravel 表迁移:无法添加外键约束【英文标题】:Laravel Table Migration: Cannot add foreign key constraint 【发布时间】:2021-08-30 01:06:32 【问题描述】:

我正在尝试在 Laravel 中创建外键,但是当我使用 artisan 迁移我的表时,我抛出了以下错误:

模块迁移表:

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateModulesTable extends Migration 
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up() 
        Schema::create('modules', function (Blueprint $table) 
            $table->id();
            $table->string('module_name');

            // foreign key

            $table->timestamps();
        );
    

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

课程迁移表:

<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

class CreateLessonTable extends Migration 
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up() 
        Schema::create('lesson', function (Blueprint $table) 
            $table->id();
            $table->string('title');
            $table->integer('module_id')->unsigned();
            $table->text('content');
            $table->integer('created_by')->unsigned();
            $table->integer('updated_by');
            $table->string('enabled');
            $table->string('position');
            $table->timestamps();
        );

        Schema::table('lesson', function(Blueprint $table) 
            $table->foreign('module_id')->references('id')->on('modules');
        );
    

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

关于我做错了什么的任何想法,我现在想得到这个,因为我有很多需要创建的表,例如用户、客户、项目、任务、状态、优先级、类型、团队。理想情况下,我想创建使用外键保存这些数据的表,即 clients_project 和 project_tasks 等。

希望有人可以帮助我开始。

【问题讨论】:

您在哪个迁移中遇到错误? $table-&gt;unsignedBigInteger('module_id');试试这个 这能回答你的问题吗? Migration: Cannot add foreign key constraint 【参考方案1】:

为 module_id 列添加 unsignedBigInteger

Schema::create('lesson', function (Blueprint $table) 
  $table->id();
  $table->string('title');
  $table->unsignedBigInteger('module_id');
  $table->text('content');
  $table->integer('created_by')->unsigned();
  $table->integer('updated_by');
  $table->string('enabled');
  $table->string('position');
  $table->timestamps();
  $table->foreign('module_id')->references('id')->on('modules');
);

【讨论】:

【参考方案2】:

您的foreign_key 字段和您的id 应该属于同一类型,例如,如果modules.idbigIncrements,那么您的Lesson 表中的foreign_key 也应该是bigInteger

课程迁移文件

Schema::create('lesson', function (Blueprint $table) 
    $table->id();
    $table->string('title');
    $table->integer('module_id')->unsigned()->nullable();
    $table->foreign('module_id')->references('id')->on('modules')->onDelete('cascade');
    $table->text('content');
    $table->integer('created_by')->unsigned();
    $table->integer('updated_by');
    $table->string('enabled');
    $table->string('position');
    $table->timestamps();
);

注意:您应该确保您的 Modules 表迁移在 Lesson 表迁移之前运行。

【讨论】:

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

迁移问题:无法在laravel中添加外键约束

Laravel:无法添加外键约束

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

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

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

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