使用迁移删除具有外键的表

Big*_*ies 48 laravel laravel-4

我试图回滚我的迁移.

我的迁移文件使用外键,如此

$table->foreign('user_one')->references('id')->on('users');
$table->foreign('user_two')->references('id')->on('users');
Run Code Online (Sandbox Code Playgroud)

我的down()函数是这样的

public function down()
{
    Schema::drop('pm_convo');
    Schema::drop('pm_convo_replys');
}
Run Code Online (Sandbox Code Playgroud)

当我运行我的迁移命令

php artisan migrate:refresh --seed --env=local
Run Code Online (Sandbox Code Playgroud)

我收到以下错误

SQLSTATE[23000]: Integrity constraint violation: 1217 Cannot delete or update a parent row: a foreign key constraint fails (SQL: drop table `pm_convo`) 
Run Code Online (Sandbox Code Playgroud)

我不确定该如何解决这个问题.

编辑:

我试过了: $table->dropForeign('pm_convo_user_one_foreign');

但我也得到了错误

小智 73

我认为这是一个更好的方法:

public function down()
{
    DB::statement('SET FOREIGN_KEY_CHECKS = 0');
    Schema::dropIfExists('tableName');
    DB::statement('SET FOREIGN_KEY_CHECKS = 1');
}
Run Code Online (Sandbox Code Playgroud)

  • 如果您有很多外键可以处理,这是一种更简单的方法,但是这适用于所有类型的数据库吗?如果您的迁移不太可能意外地将外键检查关闭,那么在开发期间也是不可能的吗?就个人而言,我觉得它更清洁只是为了正确订购它们 (5认同)
  • 架构:: disableForeignKeyConstraints(); 架构::降( 'table_child');架构::降( 'table_parent');架构:: enableForeignKeyConstraints(); 根据手册.对于Laravel 5.2 (5认同)

Nil*_*ner 62

pm_convo_replys有一个引用的外键pm_convo,因此你不能在不pm_convo违反外键约束的情况下删除pm_convo_replys.

要同时删除您需要删除pm_convo_replys第一.

public function down()
{
    Schema::drop('pm_convo_replys');
    Schema::drop('pm_convo');
}
Run Code Online (Sandbox Code Playgroud)


Din*_*nga 27

我也遇到过这类问题.迁移文件顺序是此处的主要问题.最好的方法是逐个创建迁移文件.应首先创建主要实体.每次创建迁移文件时都应刷新迁移.(带php artisan migrate:refresh)

据@abkrim和@Eric说

public function down()
{
    Schema::disableForeignKeyConstraints();
    Schema::drop('tableName');
    Schema::enableForeignKeyConstraints();
}
Run Code Online (Sandbox Code Playgroud)


eit*_*hed 8

我认为这是最正确的方法:

public function down()
{
    Schema::table('[table]', function (Blueprint $table) {
        $table->dropForeign('[table]_[column]_foreign');
        $table->dropColumn('[column]');
    });
}
Run Code Online (Sandbox Code Playgroud)