SQLSTATE [23000]:完整性约束违规:1217

时间:2015-01-21 09:55:32

标签: mysql laravel database-migration artisan

在我的项目中进行了多次迁移后,我想回滚更新一些内容,但是当我试图删除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');
    }

在上一次迁移中,我可能犯的错误是什么?!迁移时我没有遇到任何问题,但只有当我回滚添加任何更改时才会出现。

知道为什么会这样吗?

4 个答案:

答案 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)

此问题通常是通过编辑/添加到现有迁移来创建的。 在处理外键时创建新的迁移文件,或者准备好转储/删除整个数据库并刷新。