Search code examples
mysqldatabaselaraveleloquentdatabase-migration

SQLSTATE[HY000]: General error: 1005 Can't create table `test`.`members` (errno: 150 "Foreign key constraint is incorrectly formed")


I'm using my migrations in Laravel to create the relationships between tables, and I have 4 tables: users, members, member_skills, and skills. I have the following code for the users table:

public function up()
{
    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->boolean('admin');
    });
}

the members table:

public function up()
{
    Schema::create('members', function (Blueprint $table) {
        $table->id();
        $table->timestamps();
        $table->string('name');
        $table->string('status');
        $table->date('date')->nullable();
        $table->text('project')->nullable();
        $table->date('start')->nullable();
        $table->foreign('name')->references('name')->on('users');
    });
}

the member_skills table:

public function up()
{
    Schema::create('member_skills', function (Blueprint $table) {
        $table->id();
        $table->timestamps();
        $table->string('name');
        $table->string('skill');
        $table->foreign('name')->references('name')->on('members');
    });
}

and the skills table:

public function up()
{
    Schema::create('skills', function (Blueprint $table) {
        $table->id();
        $table->timestamps();
        $table->string('skill');
        $table->text('description');
        $table->foreign('skill')->references('skill')->on('member_skills');
    });
}

However, running my migrations results to (errno: 150 "Foreign key constraint is incorrectly formed"). I have read that changing the migration order should fix the problem, so I have arranged the 4 tables to be migrated in the order of users, members, member_skills, and skills, but I am still receiving the same error. Is there anything else I'm doing wrong?


Solution

  • Here is the right way todo this

    public function up()
    {
       Schema::create('members', function (Blueprint $table) {
          ...
          $table->unsignedBigInteger('user_id');
          $table->foreign('user_id')->references('id')->on('users');
       });
    }
    
    public function up()
    {
       Schema::create('member_skills', function (Blueprint $table) {
          ...
          $table->unsignedBigInteger('member_id');
          $table->foreign('member_id')->references('id')->on('members');
       });
    }
    
    public function up()
    {
       Schema::create('skills', function (Blueprint $table) {
          ...
          $table->unsignedBigInteger('member_skill_id');
          $table->foreign('member_skill_id')->references('id')->on('member_skills');
       });
    }
    

    more:https://laravel.com/docs/8.x/migrations#foreign-key-constraints