Laravel 抛出 errno:150 “外键约束的格式不正确”,尽管语法正确

Posted

技术标签:

【中文标题】Laravel 抛出 errno:150 “外键约束的格式不正确”,尽管语法正确【英文标题】:Laravel throws errno: 150 "Foreign key constraint is incorrectly formed" despite the correct syntax 【发布时间】:2020-08-12 03:45:06 【问题描述】:

我正在尝试添加一个包含两个外键的表,见下文:

Schema::create('semester_cohorts', function (Blueprint $table) 
        $table->bigIncrements('id');
        $table->unsignedBigInteger('semester_id');
        $table->unsignedBigInteger('cohort_id');
        $table->timestamps();

        $table->foreign('semester_id')
            ->references('semesters')
            ->on('id')
            ->onDelete('cascade');

        $table->foreign('cohort_id')
            ->references('id')
            ->on('cohorts')
            ->onDelete('cascade');
    );

我收到以下消息:PDOException::("SQLSTATE[HY000]: General error: 1005 Can't create table [table name](errno: 150 "Foreign key constraint is incorrectly formed")"),尽管数据库中存在相应的引用表,但名称中没有拼写错误,并且主键/外键的类型匹配。什么可能导致这个问题? `

【问题讨论】:

【参考方案1】:

您的第一个外键中混淆了referenceson

$table->foreign('semester_id')
            ->references('semesters')
            ->on('id')
            ->onDelete('cascade');

应该是

$table->foreign('semester_id')
            ->references('id')
            ->on('semesters')
            ->onDelete('cascade');

【讨论】:

【参考方案2】:

这里可能有一些问题:

检查两个表的列类型,类型应该相同

尝试拆分迁移。首先创建表 semester_cohorts 然后在下面使用

Schema::table('semester_cohorts', function (Blueprint $table) 
   $table->foreign('semester_id')
        ->references('id')
        ->on('semesters')
        ->onDelete('cascade');

    $table->foreign('cohort_id')
        ->references('id')
        ->on('cohorts')
        ->onDelete('cascade');
);

【讨论】:

【参考方案3】:

我实际上遇到了这个问题,这是因为unsignedBigInteger 类型。

外键列必须与其引用的主键具有相同的数据类型。

因此,如果您在semesterscohorts 表中的主键bigIncrements 类型的

您应该将外键类型定义为BigInteger,然后在其后面加上unsigned()

  $table->bigIncrements('id');
    $table->bigInteger('semester_id')->unsigned();
    $table->bigInteger('cohort_id')->unsigned();
    $table->timestamps();

编辑:

就像kerbholz说你在定义外键时有一个错误

【讨论】:

这两个表中的主键都是 unsignedBigInteger(或者,确切地说是返回 unsignedBigInteger 的 bigIncrements)

以上是关于Laravel 抛出 errno:150 “外键约束的格式不正确”,尽管语法正确的主要内容,如果未能解决你的问题,请参考以下文章

Laravel 迁移:“外键约束格式不正确”(errno 150)

laravel 8 (errno: 150 "外键约束格式不正确")

laravel errno 150 外键约束格式不正确

MySQL创建表:错误1005 errno:150“外键约束形成错误”

SQL 无法创建表 (errno: 150)

mysql。无法创建表 errno 150