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

Posted

技术标签:

【中文标题】laravel 5.4 迁移错误:150“外键约束格式不正确”【英文标题】:laravel 5.4 migration errno: 150 "Foreign key constraint is incorrectly formed" 【发布时间】:2017-11-12 19:10:31 【问题描述】:

有 4 个迁移,如下所示。 这是用户表。

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

这就是艺术家迁移。

Schema::create('artists', function (Blueprint $table) 
            $table->increments('id');
            $table->string('name');
            $table->string('slug');
            $table->string('image')->nullable();
            $table->text('biography')->nullable();
            $table->integer('week_hits');
            $table->timestamp('week_date');
            $table->timestamp('viewed_now');
            $table->boolean('status')->default(1);
            $table->integer('user_id')->unsigned();
            $table->foreign('user_id')->references('id')->on('users');
            $table->timestamps();
        );

这是歌曲迁移。

Schema::create('songs', function (Blueprint $table) 
            $table->increments('id');
            $table->string('title');
            $table->text('lyrics')->nullable();
            $table->string('mp3');
            $table->string('youtube_id')->nullable();
            $table->timestamp('week_date');
            $table->integer('week_hits')->nullable();
            $table->timestamp('played_now')->nullable();
            $table->timestamp('hits');
            $table->integer('album_id')->unsigned()->nullable();
            $table->foreign('album_id')->references('id')->on('albums');
            $table->integer('artist_id')->unsigned();
            $table->foreign('artist_id')->references('id')->on('artists');
            $table->timestamps();
        );
    

这是专辑迁移。

Schema::create('albums', function (Blueprint $table) 
            $table->increments('id');
            $table->string('name');
            $table->string('cover');
            $table->integer('artist_id')->unsigned();
            $table->foreign('artist_id')->references('id')->on('artists');
            $table->boolean('status')->default(true);
            $table->timestamp('viewed_now')->nullable();
            $table->integer('week_hits')->nullable();
            $table->timestamp('week_date');
            $table->timestamps();
        );

这是连接多对多、艺术家和歌曲的特色。

Schema::create('featuring', function (Blueprint $table) 
    $table->integer('artist_id')->unsigned()->nullable();
    $table->foreign('artist_id')->references('id')->on('artists');
    $table->integer('song_id')->unsigned()->nullable();
    $table->foreign('song_id')->references('id')->on('songs')->onDelete('cascade');
    $table->timestamps();
);

当我尝试迁移这四个迁移时,我得到了这个错误。

SQLSTATE[HY000]: General error: 1005 Can't create table `laravel`.`#sql-f0_11e` (errno: 150 "Foreign key constraint is incorrectly formed") (SQL: alter table `songs` add const
  raint `songs_album_id_foreign` foreign key (`album_id`) references `albums` (`id`))

【问题讨论】:

如果你从 $table->integer('album_id')->unsigned()->nullable() 中删除 nullable();它有效吗?您是否收到差异错误? 即使我删除了 nullable,它也会出现同样的错误。 ***.com/questions/22615926/…看看这个,可能对你有帮助 您的迁移顺序似乎有问题。应在创建它们引用的表之后创建具有外键的表。请检查创建表的顺序。 现在按顺序创建的迁移。在我的帖子中 【参考方案1】:

您首先创建了表songs,然后创建了表albums。当您尝试在songs 表中添加外键album_id 时,albums 表尚未创建,因此您无法在未创建该表的情况下将外键添加到表中。

所以,你需要做的是,在songs 表之前创建albums 表。

【讨论】:

@sohaieb 很高兴为您提供帮助;)【参考方案2】:

您可能无法在创建过程中设置外键。您必须创建表然后设置外键。您可以使用 Schema::create 创建表,然后使用 Schema::table 设置外键。示例:

Schema::create('users', function (Blueprint $table) 
    $table->increments('id');
);

Schema::table('posts', function (Blueprint $table) 
    $table->integer('user_id')->unsigned();

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

【讨论】:

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

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

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

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

Laravel 5.4 - 删除外键的唯一约束时出错[重复]

添加外键时Laravel迁移错误

Laravel 迁移不能在用户表中添加外键