2015-01-21 5 views
1

프로젝트에서 여러 마이그레이션을 수행 한 후 몇 가지를 업데이트하기 위해 롤백하고 싶었지만 projects 테이블을 삭제하려고 갑자기이 오류가 발생했습니다. 외래 키 제약을 두 번 확인했지만 오류를 찾을 수 없습니다. 여기 SQLSTATE [23000] : 무결성 제약 조건 위반 : 1217

[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.create 테이블 사용자 :

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.create 클라이언트 테이블 :

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.create 프로젝트 테이블 :

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'); 
    } 

ast 마이그레이션, 내가 뭘하고있는 실수 일 수 있니?! 마이그레이션 할 때 아무런 문제가 없지만 변경 사항을 추가하기 위해 롤백 한 경우에만 나타납니다.

왜 이런 일이 발생하는지 알고 싶습니다. 언급 한 위의 단지 3 테이블이있는 경우

답변

3

, 나는 테이블을 만들

php artisan migrate 

와 그것을 자신을 시도하고

php artisan migrate:rollback 

롤백로 마이그레이션에는 문제가 없습니다.

내가 아는 한 가지는 Laravel이 마이그레이션 파일 타임 스탬프를 기반으로 마이그레이션 순서를 취하는 것입니다.

따라서, 나는 오류 님에게 메일로 떨어되지 않은 projects 테이블에 대한 외래 키 참조가 다른 테이블이입니다 확신합니다 (SQL : 드롭 테이블 projects가)

시도 php artisan tinker를 사용하고 Schema::drop('some_table_name'); 여기서 some_table_nameprojects 테이블에 대한 참조가있는 테이블입니다. 그런 다음 projects 테이블을 다시 놓으십시오.

+3

이것은 문제의 해답이 아닙니다. –

3

down 기능에서 사용하십시오. 당신이 당신의 테이블의 외래 키를 사용하는 경우

public function down() 
{ 
    DB::statement('SET FOREIGN_KEY_CHECKS = 0'); 
    Schema::dropIfExists('tableName'); 
    DB::statement('SET FOREIGN_KEY_CHECKS = 1'); 
} 
2

당신은 다른 사람이 당신이 현재 받고 무결성 제약 문제로 실행됩니다, 당신은 당신의 테이블을 삭제하기 전에 dropForeign 방법을 사용하여 사람들을 제거해야합니다.

public function down() 
{ 
    Schema::table('projects', function(Blueprint $table) { 
     $table->dropForeign('projects_client_id_foreign'); 
    }); 

    Schema::drop('projects'); 
} 
1

이 문제는 일반적으로 기존 마이그레이션을 편집/추가하여 만들어집니다. 외래 키를 처리 할 때 새 마이그레이션 파일을 만들거나 전체 데이터베이스를 덤프/드롭하고 새로 고칠 준비가되어 있어야합니다.

관련 문제