[英]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
)在刪除級聯上引用users
( id
))
這是我的遷移:
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);
});
}
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
對於嘗試的放置方法:
對於創建遷移
公共功能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.