【问题标题】:Laravel 5.2 rollback database with foreign keyLaravel 5.2 使用外键回滚数据库
【发布时间】:2018-10-05 16:28:37
【问题描述】:

我正在尝试回滚我的数据库,但出现此错误:

[照亮\数据库\查询异常] SQLSTATE[23000]:完整性约束违规:1217 无法删除或更新父行:外键约束失败(SQL:删除表tb_levels

[PDO异常] SQLSTATE[23000]:完整性约束违规:1217 无法删除或更新父行:外键约束失败

这是我的迁移代码:

public function up()
{
    Schema::disableForeignKeyConstraints();

    Schema::create('tb_users', function (Blueprint $table) {
        $table->engine = 'InnoDB';

        $table->increments('id_user');
        $table->string('name');
        $table->string('username');
        $table->string('email')->unique();
        $table->integer('id_level')->unsigned();
        $table->string('password', 60);
        $table->rememberToken();
        $table->boolean('activated')->default(false);
        $table->timestamps();

        $table->foreign('id_level')->references('id_level')->on('tb_levels');
    });

    Schema::enableForeignKeyConstraints();
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    Schema::disableForeignKeyConstraints();
    Schema::table('tb_users', function(Blueprint $table){
        $table->dropForeign('tb_users_id_level_foreign');
        $table->dropColumn('id_level');
    });
    Schema::drop('tb_users');
    Schema::enableForeignKeyConstraints();
}

我已经尝试了我在这个论坛上找到的几种方法,但仍然出现错误,请帮助?

【问题讨论】:

    标签: laravel migration laravel-5.2 database-migration


    【解决方案1】:

    首先使用这个禁用外键:

    SET FOREIGN_KEY_CHECKS=1;

    SET GLOBAL FOREIGN_KEY_CHECKS=1;

    然后迁移您的数据库。

    再次应用外键约束:

    SET FOREIGN_KEY_CHECKS=0;

    SET GLOBAL FOREIGN_KEY_CHECKS=0;

    【讨论】:

    • 嗯...是迁移数据库还是回滚数据库?
    • 它将禁用外键约束,之后您可以迁移或回滚
    • 我应该把代码放在哪里?在 mysql 上还是在我的代码上?我已经尝试将它放在我的代码上,但仍然显示该错误。
    • 先把代码放到 MySQL 中,然后进行任何你想应用的操作
    • 这可能不是最好的答案,但它解决了我在枪下的问题。谢谢@SachinAghera
    【解决方案2】:

    好吧,我终于找到了解决这个错误的方法,

    首先你需要进行迁移以删除外键和列,代码如下:

    public function up()
    {
        Schema::disableForeignKeyConstraints();
    
        Schema::table('tb_users', function(Blueprint $table){
            $table->dropForeign('tb_users_id_level_foreign');
            $table->dropColumn('id_level');
        });
    
        Schema::enableForeignKeyConstraints();
    }
    

    然后迁移它,之后它会删除列和外键。

    之后删除 Schema::table 代码,保存并运行命令:

    php artisan migrate:reset
    

    嗯,它有效,但它确实是一种不切实际的方式,

    希望外面有比这个更简单的方法。

    【讨论】: