簡體   English   中英

無法添加外鍵約束[Laravel 5.6]

[英]Cannot add foreign key constraint [Laravel 5.6]

TL;博士。 解:

多虧喬納斯(Jonas)

問題是我所引用的表不是InnoDB。

我在變更遷移中添加了原始SQL語句,然后添加了外鍵:

DB::statement("ALTER TABLE table ENGINE='InnoDB';");

原始問題

首先,在Stackoverflow警察讓我破產之前,我知道這個問題可能占該網站數據庫的83%。 但是我很特別(孩子,我知道我不是)。 但是我已經嘗試了大多數常見的東西,但似乎沒有任何效果。 所以可能我正在監督一些事情。

錯誤

常規錯誤:1215無法添加外鍵約束(SQL:alter table applications添加約束applications_user_id_foreign外鍵( user_id )在刪除級聯上引用usersid ))

這是我的遷移:

public function up()
{
    Schema::create("applications", function(Blueprint $table) {
        $table->engine = "InnoDB";
        $table->increments('id');
        $table->timestamps();
    });

    Schema::table('applications', function($table) {

        $table->integer('user_id')->unsigned()->index();
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        $table->integer('job_request_id')->unsigned()->index();
        $table->foreign('job_request_id')->references('id')->on('job_requests')->onDelete('cascade');
        $table->integer('status')->default(0);
    });
}

我已經嘗試過的:

1。

public function up()
{
    Schema::create("applications", function(Blueprint $table) {
        $table->increments('id');
        $table->timestamps();

        $table->integer('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        $table->integer('job_request_id')->unsigned();
        $table->foreign('job_request_id')->references('id')->on('job_requests')->onDelete('cascade');
        $table->integer('status')->default(0);
    });
}

2。

public function up()
{
    Schema::create("applications", function(Blueprint $table) {
        $table->engine = "InnoDB";
        $table->increments('id');
        $table->timestamps();

        $table->integer('user_id')->unsigned();
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        $table->integer('job_request_id')->unsigned();
        $table->foreign('job_request_id')->references('id')->on('job_requests')->onDelete('cascade');
        $table->integer('status')->default(0);
    });
}
  1. 將遷移分為兩個文件(一個創建和一個更改)。 甚至一個一個地添加每個引用。

4.-使用DB :: statement('SET FOREIGN_KEY_CHECKS = 0;'); 並且在遷移開始和結束時= 1。

5.-刪除unsigned()和index()。

可能意味着:

1.-當我回滾遷移時,它不會刪除表。 因此,如果我回滾和遷移,將會給我一個“已經存在的錯誤”。

2.-我已經有引用相同項目的遷移,即:

Schema::create('job_requests', function (Blueprint $table) {
        ...
        $table->integer('user_id')->unsigned()->nullable();
        $table->foreign('user_id')->references('id')->on('users');
        ...
    });

UPDATE

對於嘗試的放置方法:

  1. 對於創建遷移

    公共功能down(){Schema :: drop('applications'); }

    公共功能down(){Schema :: dropIfExists('applications'); }

2.-對於其他遷移

public function down()
{
    Schema::table('applications', function (Blueprint $table) {
        $table->dropForeign(['user_id']);
        $table->dropColumn('user_id');
        $table->dropForeign(['job_request_id']);
        $table->dropColumn('job_request_id');
    });
}

更新2:

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->string('first_name');
        $table->string('last_name')->nullable();
        $table->string('password');
        $table->rememberToken();
        $table->timestamps();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::dropIfExists('users');
}

public function up()
{
    Schema::create('job_requests', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('status')->default(0);
        $table->integer('user_id')->unsigned()->nullable();
        $table->foreign('user_id')->references('id')->on('users');
        $table->timestamps();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::dropIfExists('job_requests');
}

我添加了另外三個變更遷移:

public function up()
{
    Schema::table('users', function (Blueprint $table) {
        $table->engine = "InnoDB";
    });
}

///////////////////////////

public function up()
{
    Schema::table('job_requests', function (Blueprint $table) {
        $table->engine = "InnoDB";
    });
}

///////////////////////////

public function up()
{
    Schema::table('applications', function (Blueprint $table) {
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
        $table->foreign('job_request_id')->references('id')->on('job_requests')->onDelete('cascade');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::table('applications', function (Blueprint $table) {
        $table->dropForeign(['user_id']);
        $table->dropForeign(['job_request_id']);
    });
}

還沒有運氣。

引用的表還必須使用InnoDB引擎。

您可以使用原始SQL語句更改它們:

DB::statement("ALTER TABLE users ENGINE='InnoDB';");
DB::statement("ALTER TABLE job_requests ENGINE='InnoDB';");

用於刪除表:

public function down()
{
  Schema::disableForeignKeyConstraints();
  Schema::dropIfExists('applications');
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM