programing

Larabel 이행: "외부 키 제약 조건이 잘못 형성되었습니다." (errno 150)

projobs 2022. 9. 29. 22:17
반응형

Larabel 이행: "외부 키 제약 조건이 잘못 형성되었습니다." (errno 150)

DB를 마이그레이션할 때 이 오류가 나타납니다.이행 실행 시 발생하는 에러에 이은 코드를 다음에 나타냅니다.

코드

public function up()
{
    Schema::create('meals', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('user_id')->unsigned();
        $table->integer('category_id')->unsigned();
        $table->string('title');
        $table->string('body');
        $table->string('meal_av');
        $table->timestamps();
        $table->foreign('user_id')
            ->references('id')
            ->on('users')
            ->onDelete('cascade');
        $table->foreign('category_id')
            ->references('id')
            ->on('categories')
            ->onDelete('cascade');
    });
}  

에러 메시지

[아까\아까\]쿼리 예외]
SQLSTATE] 오류: HY000을 할 수 1005번입니다.meal.#sql-11d2_1 4 " is formed alter: errno: "Foreign Key Constraint is incorrected"(SQL: alter))
'''meals restraint key 추가)category_id) 「」를 참조해 주세요categories )id스케이드드)))))))

Laravel에서 새 테이블을 만들 때.이행은 다음과 같이 생성됩니다.

$table->bigIncrements('id');

(이전 버전의 Larabel) 대신:

$table->increments('id');

「」를 사용하고 bigIncrements외부 키는 정수 대신 bigInteger를 요구합니다.코드는 다음과 같습니다.

public function up()
    {
        Schema::create('meals', function (Blueprint $table) {
            $table->increments('id');
            $table->unsignedBigInteger('user_id'); //changed this line
            $table->unsignedBigInteger('category_id'); //changed this line
            $table->string('title');
            $table->string('body');
            $table->string('meal_av');
            $table->timestamps();

            $table->foreign('user_id')
                ->references('id')
                ->on('users')
                ->onDelete('cascade');

            $table->foreign('category_id')
                ->references('id')
                ->on('categories')
                ->onDelete('cascade');
        });
    }  

,도할 수 .incrementsbigIncrements키코 세지오의 말처럼.

Integer와 BigInteger의 차이는 크기입니다.

  • int => 32비트
  • bigint => 64비트

@JuanBonnett의 질문은 나에게 답을 찾는 영감을 주었다.파일 작성 시간을 고려하지 않고 Larabel을 사용하여 프로세스를 자동화했습니다.워크플로우에 따르면 "meals"는 카테고리 전에 스키마 파일(meals)을 작성했기 때문에 다른 테이블(category)보다 먼저 작성됩니다.그건 내 잘못이야.

를 들어 "I want my my"와 같이 이행을 작성해야 합니다.users을 마시다role_id의 나 which에서 가져온 roles

먼저 역할 이행을 시작합니다.php artisan make:migration create_roles_table --create=roles

이행입니다.php artisan make:migration create_users_table --create=users

php artisan migration는 생성된 파일 2017_08_22_074128_create_contable_table의 순서를 사용하여 실행됩니다.php 및 2017_08_22_134306_create_users_table은 실행 순서가 되는 날짜/시간 순서를 확인합니다.

files 2017_08_22_074128_create_complete_table.php

public function up()
{
    Schema::create('roles', function (Blueprint $table) {
        $table->increments('id');
        $table->string('name', 50);
        $table->timestamps();
    });
}

2017_08_22_134306_create_users_table

public function up()
{
    Schema::create('users', function (Blueprint $table) {
        $table->increments('id');
        $table->integer('role_id')->unsigned();
        $table->string('name');
        $table->string('phone', 20)->unique();
        $table->string('password');
        $table->rememberToken();
        $table->boolean('active');
        $table->timestamps();
        $table->foreign('role_id')->references('id')->on('roles');
    });
}

더하면 돼요.->unsigned()->index()그러면 작동하게 됩니다.

나에게는 모든 것이 제대로 되어 있었지만, 그것은 여전히 작동하지 않았다.그리고 나서 나는 프라이머리 키가 서명되지 않은 것이 틀림없다는 것을 만지작거리면서 알게 되었다.

//this didn't work
$table->integer('id')->unique();
$table->primary('id');

//this worked
$table->integer('id')->unsigned()->unique();
$table->primary('id');

//this worked 
$table->increments('id');

데이터 타입 불일치 문제에 대해서도 같은 메시지를 받았습니다.

'id'에 bigIncrements()를 사용했는데 외부 키(bigInteger() 사용)로 사용했을 때 오류가 발생하였습니다.

솔루션을 찾았습니다.bigIncrements()unsignedBig를 반환합니다.정수.따라서 서명되지 않은 빅을 사용해야 합니다.외부 키의 bigInteger()가 아닌 Integer()

다른 사람에게 도움이 될 수 있기 때문에 공유

하시는 ->onDelete('set null') 키 키 가 " " "인지 합니다.nullable(),

//Column definition
$table->integer('user_id')->unsigned()->index()->nullable(); //index() is optional

//...
//...

//Foreign key 
$table->foreign('user_id')
      ->references('id')
      ->on('users')
      ->onDelete('set null');

라라벨 5.8

외부 키 열에 unsignedBig를 사용합니다.외부 키 데이터 유형의 불일치를 방지하기 위한 정수입니다.예를 들어, 2개의 테이블 질문과 답변이 있다고 가정합니다.
질문 테이블은 다음과 같습니다.

 public function up()
    {
        Schema::create('questions', function (Blueprint $table) {
            $table->bigIncrements('id');
             $table->text('body');
             $table->integer('user_id')->unsigned();
            $table->timestamps();
        });
    }

응답 테이블은 다음과 같습니다.

public function up()
{
    Schema::create('replies', function (Blueprint $table) {
        $table->bigIncrements('id');
        $table->text('body');
        $table->unsignedBigInteger('question_id');
        $table->integer('user_id')->unsigned();
        $table->foreign('question_id')->references('id')->on('questions')->onDelete('cascade');
        $table->timestamps();
    });
}

이행은 하향식으로 작성해야 합니다.

먼저 어느 누구에게도 속하지 않는 테이블의 이행을 작성합니다.

그런 다음 이전 표에 속하는 테이블에 대한 마이그레이션을 만듭니다.


테이블 엔진 문제에 대한 간단한 답변:

테이블의 스토리지 엔진을 설정하려면 스키마 작성기에서 엔진 속성을 설정합니다.

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

    $table->increments('id');
});

Laravel Docs에서 : https://laravel.com/docs/5.2/migrations

나는 라라벨 6에서 같은 문제에 직면해야 했다.나는 이것을 다음과 같이 해결한다.

당신이나 다른 사람에게 도움이 된다고 생각합니다.

    $table->bigIncrements('id');
    $table->bigInteger('user_id')->unsigned(); //chnage this line
    $table->bigInteger('category_id')->unsigned(); //change this line
    ---
    $table->foreign('user_id')
        ->references('id')
        ->on('users')
        ->onDelete('cascade');
    $table->foreign('category_id')
        ->references('id')
        ->on('categories')
        ->onDelete('cascade');

"큰 정수"를 사용하여 ID를 증가시킵니다.

정수 대신 bigInteger를 사용

  1. 아직 오류가 있는 경우.

이행 파일을 다음의 방법으로 재주문하는 것을 추천합니다.

마이그레이션 파일 이름의 첫 부분을 구성하는 날짜를 원하는 순서대로 변경합니다(예: 2020_07_28_133303_update_categories).php, 날짜와 시간은 2020-07-28, 13:33:03);

N.B: 첫 번째 파일은 'meals' 이행 파일이 아닌 'categories' 이행 파일이어야 합니다.

5. N.B: Larabel 5.6 ★$table->increments('id'); ; ;$table->integer('user_id')->unsigned();

제 경우 새로운 라라벨 규약이 이 오류를 야기하고 있습니다.

작성의 가능id성공했어.

$table->increments('id'); // ok

(대신:

$table->bigIncrements('id'); // was the error.

이미 작업 중Laravel v5.8을 사용하다

제 경우 참조 테이블 중 하나는 InnoDB이고 다른 하나는 MyISAM이었습니다.

MyISAM은 해외 키 관계를 지원하지 않습니다.

이제 두 테이블 모두 InnoDB가 되었습니다.문제는 해결됐습니다.

Larabel 6: 2020년 1월 17일 갱신

$table->bigInteger( 'category_id' )->unsigned();

이것은 나에게 잘 작동했다.

여기에 도착하는 누구에게나 도움이 될 수 있습니다.저는 방금 같은 문제를 경험했습니다만, 제 경우는 외부 키 제약보다 먼저 외부 키 열에 (복합) 고유의 제약이 설정되어 있었습니다.저는 "해외" 성명 뒤에 "독특" 성명서를 넣음으로써 문제를 해결했습니다.

동작:

$table->foreign('step_id')->references('id')->on('steps')->onDelete('cascade');
$table->unique(['step_id','lang']);

동작하지 않음:

$table->unique(['step_id','lang']);
$table->foreign('step_id')->references('id')->on('steps')->onDelete('cascade');

Laravel 8을 사용하고 있는데 같은 오류가 발생하였습니다.문제는 users.id과 같은 열과 user_id가 모두 같아야 한다는 것입니다.여기서 user_id는 외부 키입니다.

users.id 는 다음과 같습니다.

Schema::create('users', function (Blueprint $table) {
    $table->increments('id');
    $table->string('name');
    $table->string('email')->unique();
    $table->timestamp('email_verified_at')->nullable();
    $table->string('password');
    $table->rememberToken();
    $table->timestamps();
});

mySql id는 Int(10) 비싱크 AUTO ICREMENT입니다.

예를 들어, 외부 키를 설정하는 다른 테이블로 이동하는 경우, user_id도 unsigned()로 변경했습니다.이전에 나는 그것을 간단하게 썼었다.$table->integer('user_id')이 경우 예외가 발생했지만 Int(10)와 Unsigned(서명 없음) 둘 다이기 때문에 오류가 발생하지 않습니다.

Schema::create('users_permissions', function (Blueprint $table) {
    $table->integer('user_id')->unsigned();
    $table->integer('permission_id')->unsigned();

    //Foreign Key Constraints
    $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    $table->foreign('permission_id')->references('id')->on('permissions')->onDelete('cascade');



    //Setting the primary keys
    $table->primary(['user_id','permission_id']);


}); 

외부 키 오류를 회피하는 한 가지 방법은 체크를 비활성화하는 것입니다. "SET FORENAR_KEY_CHECKS"이것은 완화의 해결책이지만, 올바른 것은 테이블과 그 관계를 조정하는 것입니다.

   DB::statement('SET FOREIGN_KEY_CHECKS=0;');

   Schema::table('example', function (Blueprint $table) {

        $table->integer('fk_example')->unsigned()->index();
        $table->foreign('fk_example')->references('id')->on('examples');
    });

  DB::statement('SET FOREIGN_KEY_CHECKS=1;');

$table-> unsigned Big를 사용합니다.정수('user_id'); 해결. (larabel 5.8)

저도 같은 문제가 있어서 이행 작성일 변경, 이 변경, 이행 실행 순서 변경, 필요한 테이블이 먼저 생성되어 외부 키로 사용되었습니다.

이행 파일의 작성 순서를 정렬해, 다른 테이블의 프라이머리 키와 같은 속성을 가지는 외부 키가 필요합니다.

는 참조 필드와 참조 필드의 데이터 유형이 완전히 동일해야 한다는 점에 유의하십시오.

"meals"를 작성할 때 먼저 범주 및 사용자 테이블을 생성해야 합니다.

이 문제를 해결하려면 카테고리 및 사용자의 마이그레이션 파일 이름을 식사 전에 작성한 이전 날짜로 변경해야 합니다.


sample:

2019_04_10_050958_create_users_table 
2019_04_10_051958_create_categories_table
2019_04_10_052958_create_meals_table

간단한 질문이니, 간단히 대답하고 빙빙 돌리지 말고 사례를 바꾸십시오.$table->integer('user_id')->unsigned();로.$table->BigInteger('user_id')->unsigned();외부 키 오류를 해결합니다.마이그레이션 파일에서 정수를 BigInteger로 변경...

추가해주세요->nullable()그리고 당신이 언급하는 모든 분야가 실제로 존재하는지 확인합니다.

  1. 데이터베이스 참조 테이블 체크인은 기본 키와 자동 증가여야 합니다.
  2. 마이그레이션할 테이블을 삭제하고 마이그레이션을 다시 실행합니다.

방금 덧붙였습니다.

$table->engine = 'MyISAM';

됐다.기본적으로 larabel은 InnoDB Engine으로 테이블을 생성하기 때문입니다.

제 경우엔 테이블 엔진의 차이가 문제였습니다.내가 참조한 표에서 나는 엔진을 지정하지 않았다.

동작되지 않습니다.

// Referenced table
Schema::create('budgets', function (Blueprint $table) {
        $table->id();
        $table->timestamps();
        $table->softDeletes();
});

// The other table
    Schema::create('payment', function (Blueprint $table) {
        $table->engine = 'InnoDB';
        $table->integer('budget_id')->unsigned()->nullable();
        $table->foreign('budget_id')
            ->references('id')
            ->on('budgets')
            ->onDelete('cascade');
        $table->timestamps();
});

제어하기 위해 테이블을 만들기 위해 모든 마이그레이션에 엔진을 설정하는 것이 좋습니다(기본 데이터베이스 설정을 신뢰하지 않음).

그건 효과가 있다.

// Referenced table
Schema::create('budgets', function (Blueprint $table) {
        $table->engine = 'InnoDB';
        $table->id();
        $table->timestamps();
        $table->softDeletes();
});

// The other table
    Schema::create('payment', function (Blueprint $table) {
        $table->engine = 'InnoDB';
        $table->integer('budget_id')->unsigned()->nullable();
        $table->foreign('budget_id')
            ->references('id')
            ->on('budgets')
            ->onDelete('cascade');
        $table->timestamps();
});

라라벨9 사용~

ID를 증분 설정으로 수정하고, 외부 키를 부호 없음으로 할당했습니다.정수를 입력한 다음 마이그레이션 파일을 해당 순서로 정렬합니다.

제 솔루션은 @Swooth 및 @Mohammad Tareq 솔루션을 기반으로 했습니다.

public function up()
{
    Schema::create('cart_items', function (Blueprint $table) {
        $table->increments('id');
        $table->unsignedInteger('session_id')->index();
        $table->foreign('session_id')->references('id')->on('shopping_sessions')
            ->onDelete('cascade');
}

이행을 순서대로 작성하기만 하면 됩니다.먼저 외부 키를 수신하지 않는 테이블을 작성해야 합니다.그런 다음 할 수 있는 것을 만듭니다.이행이 이미 작성되어 있는 경우에는 이행일시를 변경하여 작성된 외부키를 수신하지 않은 테이블이 사전에 작성되지 않도록 합니다.

언급URL : https://stackoverflow.com/questions/32669880/laravel-migration-foreign-key-constraint-is-incorrectly-formed-errno-150

반응형