刷新迁移时出现外键约束错误 - Laravel
Foreign key constraint error when refreshing migrations - Laravel
我的 Laravel 项目在迁移时遇到问题。
因为我是 Laravel 的新手,所以我搞不懂。
我想向已经存在的 table 添加一个外键,这可行,但是当我刷新我的迁移时,我得到这个错误:
[Illuminate\Database\QueryException]
SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key
constraint fails (SQL: drop table `battles`)
[PDOException]
SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key
constraint fails
这些是我目前拥有的迁移:
Table 项目
class CreateProjectsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('projects', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->string('body');
$table->string('tags');
$table->string('img');
$table->string('img_tricolor');
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('projects');
}
}
Table 战斗
class CreateBattlesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('battles', function (Blueprint $table) {
$table->increments('id');
$table->string('battle_theme');
$table->boolean('battle_active');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('battles');
}
}
为项目中的战斗添加外键
class AddProjectsBattleIdFk extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('projects', function (Blueprint $table) {
$table->integer('battle_id')->unsigned();
$table->foreign('battle_id')->references('id')->on('battles')->onDelete('set null');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('projects', function (Blueprint $table) {
//
});
}
}
我想这与战斗有关table。
在down
方法中你需要先删除外键:
在CreateProjectsTable
public function down()
{
Schema::table('projects', function (Blueprint $table) {
$table->dropForeign('projects_user_id_foreign');
});
Schema::drop('projects');
}
在AddProjectsBattleIdFk
public function down()
{
Schema::table('projects', function (Blueprint $table) {
$table->dropForeign('projects_battle_id_foreign');
$table->dropColumn('battle_id');
});
}
我遇到了同样的问题,Marcin 的回答有效,但我还发现另一个选项是使用 fresh
而不是 refresh
,在这种情况下你不需要删除外键。
我不知道这个更新的解决方案是否能帮助面临同样问题的人:
在向下迁移功能中使用它
Schema::disableForeignKeyConstraints();
我通常创建为最后一次迁移或将其命名为最后一次排序(因为迁移命令按顺序运行迁移文件夹下的文件)类似于 2099_12_32_AlterTablesCreateForeignKeysmigration
up
函数中的我为每个 table 指定我的所有键并在最后启用外键约束 Schema::enableForeignKeyConstraints();
然后在 down
中我只是禁用它们 Schema::disableForeignKeyConstraints();
以允许重置以截断table秒。
我的 Laravel 项目在迁移时遇到问题。
因为我是 Laravel 的新手,所以我搞不懂。
我想向已经存在的 table 添加一个外键,这可行,但是当我刷新我的迁移时,我得到这个错误:
[Illuminate\Database\QueryException]
SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key
constraint fails (SQL: drop table `battles`)
[PDOException]
SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key
constraint fails
这些是我目前拥有的迁移:
Table 项目
class CreateProjectsTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('projects', function (Blueprint $table) {
$table->increments('id');
$table->string('title');
$table->string('body');
$table->string('tags');
$table->string('img');
$table->string('img_tricolor');
$table->integer('user_id')->unsigned();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->timestamps();
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('projects');
}
}
Table 战斗
class CreateBattlesTable extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::create('battles', function (Blueprint $table) {
$table->increments('id');
$table->string('battle_theme');
$table->boolean('battle_active');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::drop('battles');
}
}
为项目中的战斗添加外键
class AddProjectsBattleIdFk extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('projects', function (Blueprint $table) {
$table->integer('battle_id')->unsigned();
$table->foreign('battle_id')->references('id')->on('battles')->onDelete('set null');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('projects', function (Blueprint $table) {
//
});
}
}
我想这与战斗有关table。
在down
方法中你需要先删除外键:
在CreateProjectsTable
public function down()
{
Schema::table('projects', function (Blueprint $table) {
$table->dropForeign('projects_user_id_foreign');
});
Schema::drop('projects');
}
在AddProjectsBattleIdFk
public function down()
{
Schema::table('projects', function (Blueprint $table) {
$table->dropForeign('projects_battle_id_foreign');
$table->dropColumn('battle_id');
});
}
我遇到了同样的问题,Marcin 的回答有效,但我还发现另一个选项是使用 fresh
而不是 refresh
,在这种情况下你不需要删除外键。
我不知道这个更新的解决方案是否能帮助面临同样问题的人:
在向下迁移功能中使用它
Schema::disableForeignKeyConstraints();
我通常创建为最后一次迁移或将其命名为最后一次排序(因为迁移命令按顺序运行迁移文件夹下的文件)类似于 2099_12_32_AlterTablesCreateForeignKeysmigration
up
函数中的我为每个 table 指定我的所有键并在最后启用外键约束 Schema::enableForeignKeyConstraints();
然后在 down
中我只是禁用它们 Schema::disableForeignKeyConstraints();
以允许重置以截断table秒。