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');
});
}
,도할 수 .increments
bigIncrements
키코 세지오의 말처럼.
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를 사용
- 아직 오류가 있는 경우.
이행 파일을 다음의 방법으로 재주문하는 것을 추천합니다.
마이그레이션 파일 이름의 첫 부분을 구성하는 날짜를 원하는 순서대로 변경합니다(예: 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()
그리고 당신이 언급하는 모든 분야가 실제로 존재하는지 확인합니다.
- 데이터베이스 참조 테이블 체크인은 기본 키와 자동 증가여야 합니다.
- 마이그레이션할 테이블을 삭제하고 마이그레이션을 다시 실행합니다.
방금 덧붙였습니다.
$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
'programing' 카테고리의 다른 글
"알 수 없는 수식어 'g'가..PHP에서 preg_match를 사용할 때? (0) | 2022.09.29 |
---|---|
Java8 java.util.java.time으로의 날짜 변환.존 날짜 시간 (0) | 2022.09.29 |
목록에서 줄임표 [...]는 무엇을 의미합니까? (0) | 2022.09.29 |
MySQL에서 고정 목록으로 항목을 주문하시겠습니까? (0) | 2022.09.29 |
날짜 범위에서 매일 행을 생성하시겠습니까? (0) | 2022.09.29 |