Laravel 5.2使用外键回滚数据库

时间:2018-04-25 09:02:22

标签: laravel migration laravel-5.2 database-migration

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

  

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

     

[PDOException]   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();
}

我已经尝试了几种在这个论坛中找到的方法,但仍然有错误,请帮忙吗?

2 个答案:

答案 0 :(得分:1)

首先使用以下方法禁用外键:

  

SET FOREIGN_KEY_CHECKS = 1;

     

SET GLOBAL FOREIGN_KEY_CHECKS = 1;

然后迁移您的数据库。

再次应用外键约束:

  

SET FOREIGN_KEY_CHECKS = 0;

     

SET GLOBAL FOREIGN_KEY_CHECKS = 0;

答案 1 :(得分:0)

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

首先,您需要进行迁移以删除外键和列,这是代码:

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

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

希望那里有更简单的方法,而不是这个。