0

I'm getting the following error:

SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table subtags add constraint subtags_tag_id_foreign foreign key (tag_id) references id (tags) on delete cascade)

After looking at other answers regarding this error on stackoverflow and this blogpost: https://www.percona.com/blog/2017/04/06/dealing-mysql-error-code-1215-cannot-add-foreign-key-constraint/ I still can't figure out why I'm getting the error.

This is the migration for the subtag table:

public function up()
{
    Schema::create('subtags', function (Blueprint $table) {
        $table->engine = 'InnoDB';
        $table->integer('tag_id')->unsigned();
        $table->integer('id')->unsigned();
        $table->string('name');
        $table->timestamps();
    });

    Schema::table('subtags', function (Blueprint $table) {
        $table->foreign('tag_id')
            ->references('tags')
            ->on('id')
            ->onDelete('cascade');

        $table->primary(array('tag_id', 'id'));
    });
}

At the point of error the tag table has already been created and I can't spot any typo's but just to make sure, here is the tag table migration:

public function up()
{
    Schema::create('tags', function (Blueprint $table) {
        $table->engine = 'InnoDB';
        $table->increments('id');
        $table->string('name');
        $table->timestamps();
    });
}
Jjampong
  • 584
  • 1
  • 4
  • 19

2 Answers2

1

Your query shows that you have misplaced the column & table in:

Schema::table('subtags', function (Blueprint $table) {
    $table->foreign('tag_id')
          ->references('tags')
          ->on('id')
          ->onDelete('cascade');

    $table->primary(array('tag_id', 'id'));
});

Reference should be "column" on "Table" like:

Schema::table('subtags', function (Blueprint $table) {
    $table->foreign(id'tag_id')
          ->references('id')
          ->on('tags')
          ->onDelete('cascade');

    $table->primary(array('tag_id', 'id'));
});
TalESid
  • 2,304
  • 1
  • 20
  • 41
0

You can disable check foreigns keys before migrate

DB::statement('SET FOREIGN_KEY_CHECKS=0;');
...
DB::statement('SET FOREIGN_KEY_CHECKS=1;');
webdevtr
  • 480
  • 2
  • 6