在我的项目中进行了多次迁移后,我想回滚更新一些内容,但是当我试图删除projects
表时突然发现了这个错误。我仔细检查了外键约束,但我找不到错误。
[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.创建表用户:
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.创建客户表:
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.创建项目表:
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');
}
在上一次迁移中,我可能犯的错误是什么?!迁移时我没有遇到任何问题,但只有当我回滚添加任何更改时才会出现。
知道为什么会这样吗?
答案 0 :(得分:4)
在向下功能中使用它。
public function down()
{
DB::statement('SET FOREIGN_KEY_CHECKS = 0');
Schema::dropIfExists('tableName');
DB::statement('SET FOREIGN_KEY_CHECKS = 1');
}
答案 1 :(得分:3)
如果上面只提到了3个表,那么您的迁移就没有问题,因为我自己尝试了
php artisan migrate
创建表格和
php artisan migrate:rollback
回滚。
我知道的一件事是Laravel将根据迁移文件时间戳假定迁移的顺序。
因此,我非常确定还有另一个表具有对projects
表的外键引用,因为错误消息是没有被删除的(SQL:drop table projects
)
尝试使用php artisan tinker
,然后使用Schema::drop('some_table_name');
其中some_table_name
是引用projects
表的表,然后再次删除projects
表。< / p>
答案 2 :(得分:2)
当您在表中使用外键时,需要在删除表之前使用dropForeign方法删除它们,否则您将遇到当前正在获得的完整性约束问题。
public function down()
{
Schema::table('projects', function(Blueprint $table) {
$table->dropForeign('projects_client_id_foreign');
});
Schema::drop('projects');
}
答案 3 :(得分:1)
此问题通常是通过编辑/添加到现有迁移来创建的。 在处理外键时创建新的迁移文件,或者准备好转储/删除整个数据库并刷新。