SQLSTATE[23000]:违反完整性约束:1217
SQLSTATE[23000]: Integrity constraint violation: 1217
在我的项目中创建多个迁移后,我想回滚以更新一些东西,但是当我尝试删除 projects
table 时突然出现此错误。我仔细检查了外键约束,但找不到错误。
[Illuminate\Database\QueryException]
SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or upda
te a parent row: a foreign key constraint fails (SQL: drop table `projects`
)
[PDOException]
SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or upda
te a parent row: a foreign key constraint fails
这是我的迁移:
1.create table 用户:
public function up()
{
Schema::create('users', function(Blueprint $table)
{
$table->increments('id');
$table->string('first_name');
$table->string('last_name');
$table->string('email', 50)->unique();
$table->string('password', 60);
$table->string('password_temp', 60);
$table->string('code', 60);
$table->boolean('active');
$table->string('remember_token', 100);
$table->timestamps();
});
}
public function down()
{
Schema::drop('users');
}
2.create 客户 table:
public function up()
{
Schema::create('clients', function(Blueprint $table)
{
$table->increments('id');
$table->integer('user_id')->unsigned()->index()->nullable();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->timestamps();
});
}
public function down()
{
Schema::drop('clients');
}
3.create 个项目 table:
public function up()
{
Schema::create('projects', function(Blueprint $table)
{
$table->increments('id');
$table->string('name');
$table->integer('status');
$table->integer('client_id')->unsigned()->index()->nullable();
$table->foreign('client_id')->references('id')->on('users')->onDelete('cascade');
$table->timestamps();
});
}
public function down()
{
Schema::drop('projects');
}
在上次迁移中,我可能做错了什么?!我在迁移时没有遇到任何问题,但它仅在我回滚以添加任何更改时出现。
知道为什么会这样吗?
如果上面提到的只有3个table,那么你的迁移没有问题,因为我已经用
自己试过了
php artisan migrate
创建 table 和
php artisan migrate:rollback
回滚。
我知道的一件事是 Laravel 将根据迁移文件时间戳假定迁移顺序。
因此,我很确定还有另一个 table 具有指向 projects
table 的外键引用,但由于错误消息是 (SQL: 掉落 table projects
)
尝试使用 php artisan tinker
,然后使用 Schema::drop('some_table_name');
,其中 some_table_name
是引用 projects
table 的 table,然后删除再次 projects
table。
在向下函数中使用它。
public function down()
{
DB::statement('SET FOREIGN_KEY_CHECKS = 0');
Schema::dropIfExists('tableName');
DB::statement('SET FOREIGN_KEY_CHECKS = 1');
}
当您在 table 中使用外键时,您需要在删除 table 之前使用 dropForeign 方法删除那些外键,否则您将 运行 陷入完整性约束问题您目前正在获得。
public function down()
{
Schema::table('projects', function(Blueprint $table) {
$table->dropForeign('projects_client_id_foreign');
});
Schema::drop('projects');
}
此问题通常是由 editing/adding 对现有迁移造成的。
要么在处理外键时创建新的迁移文件,要么准备好 dump/drop 你的整个数据库并刷新。
在我的项目中创建多个迁移后,我想回滚以更新一些东西,但是当我尝试删除 projects
table 时突然出现此错误。我仔细检查了外键约束,但找不到错误。
[Illuminate\Database\QueryException]
SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or upda
te a parent row: a foreign key constraint fails (SQL: drop table `projects`
)
[PDOException]
SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or upda
te a parent row: a foreign key constraint fails
这是我的迁移: 1.create table 用户:
public function up()
{
Schema::create('users', function(Blueprint $table)
{
$table->increments('id');
$table->string('first_name');
$table->string('last_name');
$table->string('email', 50)->unique();
$table->string('password', 60);
$table->string('password_temp', 60);
$table->string('code', 60);
$table->boolean('active');
$table->string('remember_token', 100);
$table->timestamps();
});
}
public function down()
{
Schema::drop('users');
}
2.create 客户 table:
public function up()
{
Schema::create('clients', function(Blueprint $table)
{
$table->increments('id');
$table->integer('user_id')->unsigned()->index()->nullable();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
$table->timestamps();
});
}
public function down()
{
Schema::drop('clients');
}
3.create 个项目 table:
public function up()
{
Schema::create('projects', function(Blueprint $table)
{
$table->increments('id');
$table->string('name');
$table->integer('status');
$table->integer('client_id')->unsigned()->index()->nullable();
$table->foreign('client_id')->references('id')->on('users')->onDelete('cascade');
$table->timestamps();
});
}
public function down()
{
Schema::drop('projects');
}
在上次迁移中,我可能做错了什么?!我在迁移时没有遇到任何问题,但它仅在我回滚以添加任何更改时出现。
知道为什么会这样吗?
如果上面提到的只有3个table,那么你的迁移没有问题,因为我已经用
自己试过了php artisan migrate
创建 table 和
php artisan migrate:rollback
回滚。
我知道的一件事是 Laravel 将根据迁移文件时间戳假定迁移顺序。
因此,我很确定还有另一个 table 具有指向 projects
table 的外键引用,但由于错误消息是 (SQL: 掉落 table projects
)
尝试使用 php artisan tinker
,然后使用 Schema::drop('some_table_name');
,其中 some_table_name
是引用 projects
table 的 table,然后删除再次 projects
table。
在向下函数中使用它。
public function down()
{
DB::statement('SET FOREIGN_KEY_CHECKS = 0');
Schema::dropIfExists('tableName');
DB::statement('SET FOREIGN_KEY_CHECKS = 1');
}
当您在 table 中使用外键时,您需要在删除 table 之前使用 dropForeign 方法删除那些外键,否则您将 运行 陷入完整性约束问题您目前正在获得。
public function down()
{
Schema::table('projects', function(Blueprint $table) {
$table->dropForeign('projects_client_id_foreign');
});
Schema::drop('projects');
}
此问题通常是由 editing/adding 对现有迁移造成的。 要么在处理外键时创建新的迁移文件,要么准备好 dump/drop 你的整个数据库并刷新。