2017-12-01 1 views
0

일부 테이블에 외래 키를 추가했지만 다시 작동하지 않습니다.Laravel 외래 키를 추가하지 못했습니다.

Schema::table('users', function(Blueprint $table){ 
    $table->integer('account_type')->unsigned()->change(); 
    $table->foreign('account_type') 
     ->references('id') 
     ->on('account_types'); 
}); 

그것은 터미널에서이 3 오류가 발생합니다 :

[Illuminate\Database\QueryException] SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint (SQL: alter table `users` add constraint `users_account_type_foreign` foreign key (`account_type`) references `account_types` (`id`)) 


[Doctrine\DBAL\Driver\PDOException]SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint 


[PDOException] SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint 

나는이 문제를 해결하기 위해 필요한 어떤 생각? 내 사용자 테이블에서 account_type 필드를 클릭하고 account_types 테이블의 관련 계정 유형으로 가져올 수는 없지만 SequelPro를 사용하면됩니다.

+0

'account_types '를 만든 후에'사용자'가 생성 되었습니까? 그렇다면'account_types' 이전 날짜를'users'보다 높게 변경하는 것이 좋습니다. – Classified

+0

@Classified 모든 마이그레이션을 다시 실행하고 싶지 않기 때문에 라이브 서버에 데이터가 있습니다. 그 주위에 다른 방법이 없습니까? – Lovelock

+0

'account_types' 테이블을'users' 테이블 전에 생성되도록 만들 수 있습니다. 그런 다음'users'를 수정하는 새로운 마이그레이션을 생성 한 다음 외부 관계를 추가 할 수 있습니다. – Classified

답변

0

'사용자'테이블보다 먼저 'account_type'테이블을 만들어야합니다.

기본적으로 Laravel에서 사용자 테이블이 처음 생성되면이를 해결하기 위해 모든 스키마를 One 마이그레이션 파일에 넣을 수 있습니다. 또는 laravel은 이름 순서로 마이그레이션을 실행하므로 사용자 파일 이름으로 날짜를 변경해야합니다.

나는 내 이전과 같이합니다

<?php 

use Illuminate\Support\Facades\Schema; 
use Illuminate\Database\Schema\Blueprint; 
use Illuminate\Database\Migrations\Migration; 

class DatabaseContent extends Migration 
{ 

/** 
* Run the migrations. 
* 
* @return void 
*/ 
public function up() 
{ 
    $connection = config('database.default'); 

    Schema::connection($connection)->create('account_type', function 
    (Blueprint $table) { 
    // Own Method 
    } 
    Schema::connection($connection)->create('users', function 
(Blueprint $table) { 
     $table->increments('id'); 
     $table->string('name'); 
     $table->timestamps(); 
    }); 
+0

'users' 테이블이 존재하지 않는다는 결론에 어떻게 도달합니까? –

+1

@Konafets 그는'users' 테이블이 존재하지 않는다고 말하는 것이 아니며, 나중에 생성되는 테이블에 대한 외부 관계를 만들 수 없다는 것을 말하고 있습니다. (비효율적으로 관계를 추가하려고 할 때 -existant'account_types' 테이블.) – Classified

+0

나는 종종 같은 문제와 그 문제를 해결했기 때문에 –

0

난 당신이 외래 키 제약 조건을 추가하기 위해 특별히 마이그레이션을 만드는 것이 좋습니다. 이주는 데이터베이스로의 각 변경 사항이 새로운 이주 인 f}으로 작성되어야합니다. 그렇게하면 문제가 생길 경우 다시 롤백 할 수 있습니다. 당신이하고 있다고 말했던 것처럼 "뒤로 물러서십시오"는 문제의 뿌리 일 가능성이 높습니다. 일부 사용자가 제안한 것처럼, 마이그레이션이 생성되는 순서는 데이터베이스 구축 방법에 중요합니다. 그리고 외부 키 구 성요소를 작성하기 위해 참여 테이블을 모두 작성 했어야합니다.

+0

아마도 내 말씨가 명확하지 않을 수 있습니다. 사용자 테이블이 존재하고 account_types 테이블도 존재합니다. 이것은 자체 마이그레이션이며 현재 실행중인 마지막 마이그레이션입니다. – Lovelock

+1

설명해 주셔서 감사합니다. 현재의'users' 테이블에있는 일부 데이터는 그러한 제약이 추가되는 것을 허용하지 않을 수도 있습니다. 'users.account_type' 열의 데이터를 확인 했습니까? –

0

이미 account_typesusers을 만든 것으로 가정하면 다음과 같이 할 수 있습니다.

새 마이그레이션을 만들려면이 명령을 실행하십시오.

php artisan make:migration add_account_type_to_users 

그리고 열 account_type를 추가 한 후 account_types 테이블에 외래 키를 추가로 어떤이는 할 것입니다 것은, 이미 존재하는 users 테이블 업데이트입니다 귀하의 업 기능이 추가.

public function up() 
{ 
    Schema::table('users', function(Blueprint $table) { 
     $table->integer('account_type')->unsigned(); 
     $table->foreign('account_type')->references('id')->on('account_types'); 
    }); 
} 

는 그런 다음 아래 기능이 추가 마이그레이션 넣다 미래의 변화 및/또는 재생의 원활하게 실행할 수 있도록. 나는 당신의 문제를 가정하고

public function down() 
{ 
    Schema::table('users', function(Blueprint $table) { 
     $table->dropColumn('account_type'); 
    }); 
} 

마이그레이션 파일의 데이트 함께 - 나는 그들에 가서 그들이 올바른 순서로 실행 얻을 있는지 확인하도록 조언한다.

관련 문제