[laravel] 마이그레이션 : 외래 키 제약 조건을 추가 할 수 없습니다

Laravel에서 외래 키를 만들려고하는데 테이블을 마이그레이션 할 때 artisan다음 오류가 발생합니다.

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

내 마이그레이션 코드는 다음과 같습니다.

우선 순위 마이그레이션 파일

public function up()
{
    //
    Schema::create('priorities', function($table) {
        $table->increments('id', true);
        $table->integer('user_id');
        $table->foreign('user_id')->references('id')->on('users');
        $table->string('priority_name');
        $table->smallInteger('rank');
        $table->text('class');
        $table->timestamps('timecreated');
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    //
    Schema::drop('priorities');
}

사용자 마이그레이션 파일

public function up()
{
    //
    Schema::table('users', function($table)
    {
    $table->create();
    $table->increments('id');
    $table->string('email');
    $table->string('first_name');
    $table->string('password');
    $table->string('email_code');
    $table->string('time_created');
    $table->string('ip');
    $table->string('confirmed');
    $table->string('user_role');
    $table->string('salt');
    $table->string('last_login');

    $table->timestamps();
    });
}

/**
 * Reverse the migrations.
 *
 * @return void
 */
public function down()
{
    //
        Schemea::drop('users');
}

내가 잘못한 것에 대한 아이디어는 지금 당장 얻고 싶습니다. 예를 들어 사용자, 클라이언트, 프로젝트, 작업, 상태, 우선 순위, 유형, 팀과 같은 많은 테이블을 만들어야합니다. 이상적으로는 외래 키, i..e와이 데이터를 저장할 테이블을 만들려면 clients_projectproject_tasks

누군가 나를 도울 수 있기를 바랍니다.



답변

두 단계로 추가하고 서명하지 않은 것이 좋습니다.

public function up()
{
    Schema::create('priorities', function($table) {
        $table->increments('id', true);
        $table->integer('user_id')->unsigned();
        $table->string('priority_name');
        $table->smallInteger('rank');
        $table->text('class');
        $table->timestamps('timecreated');
    });

   Schema::table('priorities', function($table) {
       $table->foreign('user_id')->references('id')->on('users');
   });

}


답변

질문이 이미 답변되었지만 다른 사람에게 도움이되기를 바랍니다.

키가 원래 테이블의 기본 키로 존재하기 전에 외래 키가있는 마이그레이션 테이블을 먼저 생성했기 때문에이 오류가 발생했습니다. 마이그레이션은 실행 후 생성 된 파일 이름으로 표시된대로 작성된 순서대로 실행 migrate:make됩니다. 예 2014_05_10_165709_create_student_table.php.

해결책은 여기에 권장 된 것처럼 외래 키가있는 파일의 이름을 기본 키가있는 파일보다 빠른 시간으로 변경하는 것입니다. http://forumsarchive.laravel.io/viewtopic.php?id=10246

나는 또한 추가해야한다고 생각합니다. $table->engine = 'InnoDB';


답변

라 라벨 ^ 5.8

Laravel 5.8 부터 마이그레이션 스텁은 기본적으로 ID 열에 bigIncrements 메소드를 사용합니다. 이전에는 증가 법을 사용하여 ID 열을 만들었습니다.

프로젝트의 기존 코드에는 영향을 미치지 않습니다. 그러나 외래 키 열의 유형이 같아야합니다 . 따라서 증가 방법 사용하여 작성된 열은 bigIncrements 방법을 사용하여 작성된 열을 참조 할 수 없습니다 .

출처 : 마이그레이션 및 큰 증가


간단한 역할 기반 응용 프로그램을 구축한다고 가정 하고 PIVOT 테이블 “role_user” 에서 user_id 를 참조해야한다고 가정 해 봅시다 .

2019_05_05_112458_create_users_table.php

// ...

public function up()
{
    Schema::create('users', function (Blueprint $table) {

        $table->bigIncrements('id');

        $table->string('full_name');
        $table->string('email');
        $table->timestamps();
    });
}

2019_05_05_120634_create_role_user_pivot_table.php

// ...

public function up()
{
    Schema::create('role_user', function (Blueprint $table) {

        // this line throw QueryException "SQLSTATE[HY000]: General error: 1215 Cannot add foreign key constraint..."
        // $table->integer('user_id')->unsigned()->index();

        $table->bigInteger('user_id')->unsigned()->index(); // this is working
        $table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
    });
}

보시다시피, 주석 처리 된 행에서 쿼리 예외가 발생합니다. 업그레이드 노트에서 언급했듯이 외래 키 열의 유형이 같아야 하므로 앞의 키를 변경해야합니다 (이 예제에서는 user_id ) BigInteger의 에서 ROLE_USER의 테이블 또는 변경 bigIncrements 에 방법 단위의 메소드 사용자 테이블과 피벗 테이블의 주석 줄을 사용, 그것은 당신에게 달려 있습니다.


이 문제를 명확하게 설명해 드리겠습니다.


답변

필자의 경우 문제는 기본 테이블에 이미 레코드가 있고 새 열이 NULL이 아니어야한다는 것입니다. 따라서 새 열에-> nullable ()을 추가하면 트릭을 수행했습니다. 질문의 예에서 다음과 같습니다.

$table->integer('user_id')->unsigned()->nullable();

또는:

$table->unsignedInteger('user_id')->nullable();

이것이 누군가를 돕기를 바랍니다!


답변

필자의 경우 문제는 users테이블 의 자동 생성 마이그레이션 이 설정되었다는 것입니다.

...
$table->bigIncrements('id');
...

그래서 열 유형을 변경해야했습니다.


$table->bigInteger('id');

외래 키 작업으로 마이그레이션을 수행합니다.

라 라벨과 함께 5.8.2


답변

필자의 경우 마이그레이션을 만드는 동안 문제가 발생했습니다. 마이그레이션을 만드는 동안 먼저 기본 마이그레이션보다 하위 마이그레이션을 만듭니다. 기본 마이그레이션을 먼저 생성하면 외래 키가 자식 테이블을 찾고 테이블이 없으므로 예외가 발생합니다.

더 :

마이그레이션을 만들면 시작 시간에 타임 스탬프가 있습니다. 마이그레이션 고양이를 만들었 으므로 모양이 비슷 2015_08_19_075954_the_cats_time.php하고이 코드가 있다고 가정 해 보겠습니다.

<?php

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

class TheCatsTime extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('cat', function (Blueprint $table) {
            $table->increments('id');
            $table->string('name');
            $table->date('date_of_birth');
            $table->integer('breed_id')->unsigned()->nullable();
        });

        Schema::table('cat', function($table) {
        $table->foreign('breed_id')->references('id')->on('breed');
      });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('cat');
    }
}

기본 테이블을 생성 한 후에 는 하위 테이블 인 다른 마이그레이션 유형 을 생성하며 자체 생성 시간 및 날짜 스탬프가 있습니다. 코드는 다음과 같습니다.

<?php

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

class BreedTime extends Migration
{
    /**
     * Run the migrations.
     *
     * @return void
     */
    public function up()
    {
        Schema::create('breed', function (Blueprint $table) {
             $table->increments('id');
             $table->string('name');
        });
    }

    /**
     * Reverse the migrations.
     *
     * @return void
     */
    public function down()
    {
        Schema::drop('breed');
    }
}

이 두 테이블 모두 올바른 것 같지만 php artisan migrate 를 실행할 때 . 이 마이그레이션을 먼저 생성하고 기본 테이블에 외래 키 제약 조건이 있으므로 하위 테이블을 찾고 하위 테이블이 존재하지 않기 때문에 마이그레이션에서 데이터베이스에 기본 테이블을 먼저 생성하기 때문에 예외가 발생합니다. 예외..

그래서:

먼저 하위 테이블 마이그레이션을 작성하십시오.

하위 마이그레이션이 작성된 후 기본 테이블 마이그레이션을 작성하십시오.

PHP 장인 마이그레이션.

작동합니다


답변

내 경우에는 테이블 마이그레이션이 먼저 생성되도록 마이그레이션이 수동으로 실행되는 순서를 변경합니다.

폴더 데이터베이스 / 마이그레이션 / 마이그레이션 파일 이름은 year_month_day_hhmmss_create_XXXX_table.php 형식입니다.

테이블 우선 순위 테이블의 생성 날짜가 사용자 날짜보다 늦게 설정되도록 사용자 파일 생성 이름을 바꾸십시오 (1 초 후에도 충분 함).