Laravel 迁移错误:150“外键约束格式不正确”
Posted
技术标签:
【中文标题】Laravel 迁移错误:150“外键约束格式不正确”【英文标题】:Laravel migration errno: 150 "Foreign key constraint is incorrectly formed" 【发布时间】:2021-12-24 07:49:59 【问题描述】:我有一个 music_upload 表,它同时引用了专辑和用户表中的 album_id
和 user_id
。 user_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 迁移:“外键约束格式不正确”(errno 150)