简体   繁体   中英

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?

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

You should try using the id of the member table as the foreign key rather than the name in the member_skills schema

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

You are getting this error because you are trying to reference name in the member table which is already a foreign key to the users table.

You can access the name of the member through the id foreign key in your blade.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM