Laravel 迁移错误:150“外键约束格式不正确”

Posted

技术标签:

【中文标题】Laravel 迁移错误:150“外键约束格式不正确”【英文标题】:Laravel migration errno: 150 "Foreign key constraint is incorrectly formed" 【发布时间】:2021-12-24 07:49:59 【问题描述】:

我有一个 music_upload 表,它同时引用了专辑和用户表中的 album_iduser_iduser_id 外键工作正常,是 album_id 外键喷出此错误

SQLSTATE[HY000]: General error: 1005 
Can't create table `nightingalev2`.`music_uploads` 
(errno: 150 "Foreign key constraint is incorrectly formed") 
(SQL: alter table `music_uploads` 
add constraint `music_uploads_album_id_foreign` foreign key (`album_id`) 
references `albums` (`id`) on delete cascade)

这是我的album 表架构

Schema::create('albums', function (Blueprint $table) 
            $table->id();
            $table->unsignedBigInteger('artist_id');
            $table->string('name');
            $table->timestamps();

            $table->foreign('artist_id')->references('id')->on('artists');
        );

这是我的music_uploads 架构

Schema::create('music_uploads', function (Blueprint $table) 
            $table->id();
            $table->unsignedBigInteger('user_id');
            $table->unsignedBigInteger('album_id');
            $table->string('filename');
            $table->string('extension');
            $table->string('artistname')->nullable();
            $table->string('albumname')->nullable();
            $table->string('playtime')->nullable();
            $table->string('genres')->nullable();
            $table->integer('length')->nullable();
            $table->string('filesize')->nullable();
            $table->string('location')->nullable();
            $table->string('thumbnail')->nullable();
            $table->timestamps();

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

            $table->foreign('album_id')->references('id')->on('albums')->onDelete('cascade');
        );

如果需要,这是我的 users 表架构

Schema::create('users', function (Blueprint $table) 
            $table->id();
            $table->string('name');
            $table->string('email')->unique();
            $table->timestamp('email_verified_at')->nullable();
            $table->string('password');
            $table->rememberToken();
            $table->timestamps();
        );
    

我从$table->id() 更改为$table->increment('id'),但它不起作用。把unsignedBitInteger改成integer()->unsigned()还是不行。

【问题讨论】:

错误似乎提到了albums 表。它的id 列是否具有兼容的数据类型?为此目的,有符号整数和无符号整数不兼容。 我不明白你的问题。你能用外行的话说清楚吗? 有符号整数和无符号整数在外键关系方面不兼容。它们必须要么都签名,要么都未签名。但是根据您上面显示的代码,您似乎已经使它们都未签名。 id() 快捷方式等同于 bigIncrements('id')mysql 用语中导致 BIGINT UNSIGNED AUTO_INCREMENT PRIMARY KEY。也许您之前使用不同的定义创建了它并且迁移正在使用它?我会去检查 MySQL 客户端并为每个表使用SHOW CREATE TABLE <name> 来确认数据类型。 我签入了albums 表,在id 列中显示id bigint(20) unsigned NOT NULL AUTO_INCREMENT @steven7mwesigwa 2021_04_03_134426_create_music_uploads_table.php 和 2021_11_11_195944_create_albums_table.php 这个? 【参考方案1】:

您的2021_04_03_134426_create_music_uploads_table 迁移实际上是在2021_11_11_195944_create_albums_table 迁移之前运行的。

解决方案。

第 1 步

重命名:2021_04_03_134426_create_music_uploads_table 致:2021_11_11_195944_create_music_uploads_table

第 2 步

重命名:2021_11_11_195944_create_albums_table.php 致:2021_04_03_134426_create_albums_table.php

第 3 步

重新运行迁移。

php artisan migrate

注意事项:

始终确保具有外键列的表(迁移)是在它们引用的表(迁移)之后创建的。

就您而言,您于 2021 年 4 月 3 日创建了 music_uploads 迁移。然后在 2021 年 11 月 11 日创建了 albums 迁移。然而,albums 迁移必须比music_uploads 更早创建。

迁移按其前置时间戳的顺序运行。

【讨论】:

以上是关于Laravel 迁移错误:150“外键约束格式不正确”的主要内容,如果未能解决你的问题,请参考以下文章

laravel 5.4 迁移错误:150“外键约束格式不正确”

Laravel 迁移错误:150“外键约束格式不正确”

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

添加外键时Laravel迁移错误

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

Laravel 迁移无法创建关系