programing

"일반 오류: 1005 테이블을 만들 수 없습니다" 라라벨 스키마 빌드 및 외부 키 사용

padding 2023. 10. 15. 17:03
반응형

"일반 오류: 1005 테이블을 만들 수 없습니다" 라라벨 스키마 빌드 및 외부 키 사용

기본적으로, 저는 이 사람과 같은 문제가 있어요. 테이블 접두사는 빼고요.저는 테이블 접두사가 없기 때문에 그의 수정이 되지 않습니다.http://forums.laravel.com/viewtopic.php?id=972

Laravel의 Schema Builder를 사용하여 다음과 같이 테이블을 작성하려고 합니다.

Schema::create('lessons', function($table)
{
    $table->increments('id');
    $table->string('title')->nullable();
    $table->string('summary')->nullable();
    $table->timestamps();
});

Schema::create('tutorials', function($table)
{
    $table->increments('id');
    $table->integer('author');
    $table->integer('lesson');
    $table->string('title')->nullable();
    $table->string('summary')->nullable();
    $table->string('tagline')->nullable();
    $table->text('content')->nullable();
    $table->text('attachments')->nullable();
    $table->timestamps();
});

Schema::table('tutorials', function($table)
{
    $table->foreign('author')->references('id')->on('users');
    $table->foreign('lesson')->references('id')->on('lessons');
});

문제는 (/setup route에서) 이 코드를 실행하면 다음과 같은 오류가 발생한다는 것입니다.

SQLSTATE[HY000]: General error: 1005 Can't create table 'tutorials.#sql-2cff_da' (errno: 150)

SQL: ALTER TABLE `tutorials` ADD CONSTRAINT tutorials_author_foreign FOREIGN KEY (`author`) REFERENCES `users` (`id`)

Bindings: array (
)

웹상의 게시물과 Laravel의 Expellent 관계를 설정하는 방법에 대한 제한된 문서를 보면, 제가 무엇을 잘못하고 있는지 잘 모르겠습니다.

users이미 존재하고 있습니다.idauto_increment()belongs_to그리고.has_many), 하지만 제가 알기로는 이것은 문제가 아닌 데이터베이스 설정입니다.DB는 InnoDB 입니다.

제가 외국 열쇠를 가지고 정확히 무엇을 잘못하고 있습니까?

저도 같은 문제를 겪고 있습니다.Laravel Schema 문서의 맨 아래에 다음과 같은 메모가 있습니다.

참고: 외부 키에서 참조되는 필드는 자동 증분일 가능성이 높으며 따라서 자동으로 부호가 없는 정수입니다.두 필드가 완전히 동일한 유형이어야 하고, 두 테이블의 엔진이 InnoDB로 설정되어야 하며, 외래 키가 있는 테이블보다 먼저 참조된 테이블을 만들어야 하므로 서명되지 않은() 외래 키 필드를 작성해야 합니다.

나는 외부 키 필드를 다음과 같이 설정하는 즉시 다음과 같이 설정할 수 있습니다.

$table->integer('author')->unsigned();

아무 문제가 없었습니다.

편집: 또한 외부 테이블의 필드가 이미 생성되었는지 확인하십시오. 그렇지 않으면 같은 오류로 인해 실패할 수 있습니다.

이것이 실패하는 이유인지 100% 확신할 수는 없지만 몇 가지 지침이 있습니다.이전 버전의 mySQL을 데이터베이스로 사용하는 경우 기본 테이블 구현은 다음과 같습니다.외부 키 구속 장치를 지원하지 않는 ISAM.스크립트가 외부 키 할당에 실패하고 있으므로 스키마의 작성 방법에서 이 구문을 사용하여 엔진으로 INNODB를 사용한다고 명시적으로 말하는 것이 좋습니다.

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

    $table->increments('id');
    $table->string('title')->nullable();
    $table->string('summary')->nullable();
    $table->timestamps();
});

이것이 여러분이 겪고 있는 문제들을 완화시켜 줄 수 있기를 바랍니다.

또한, 당신은 사후적으로 외국 키를 선언할 수 있지만, 나는 내가 올바른 DB 엔진 세트를 가지고 있는지 쉽게 확인할 수 있기 때문에 초기 스키마 내에서 외국 키를 만듭니다.

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

    $table->increments('id');
    $table->integer('author');
    $table->integer('lesson');
    $table->string('title')->nullable();
    $table->string('summary')->nullable();
    $table->string('tagline')->nullable();
    $table->text('content')->nullable();
    $table->text('attachments')->nullable();
    $table->timestamps();

    $table->foreign('author')->references('id')->on('users');
    $table->foreign('lesson')->references('id')->on('lessons');
});

이것이 여러분의 문제를 해결하는데 도움이 되기를 바랍니다.

이미 나열된 답변에 대한 요약과 제 답변:

  1. 으로 합니다가 합니다.InnoDb합니다를 합니다.

    $table->engine = 'InnoDB';
    
  2. 외부 키를 사용하려면 참조된 테이블이 있어야 합니다.키를 만들기 전에 참조된 테이블이 이전 마이그레이션에서 생성되었는지 확인합니다.별도의 마이그레이션에서 키를 생성하는 것을 고려하여 확인합니다.

  3. 외부 키를 사용하려면 데이터 유형이 일치해야 합니다.참조된 필드가 같은 유형인지, 서명된 필드인지, 서명되지 않은 필드인지, 길이가 같은지(또는 그보다 작은지)를 확인합니다.

  4. 핸드코딩 마이그레이션을 전환하고 생성기를 사용하는 경우 사용 중인 ID 유형을 확인해야 합니다.Artisan은 기본적으로 증분()을 사용하지만 Jeffrey Way는 정수('id', true)를 선호하는 것 같습니다.

저도 이 문제에 부딪혔습니다.

제가 찾은 해결책은 다른 테이블이 참조하기 전에 외국 id가 포함된 테이블을 만들어야 한다는 것입니다.기본적으로 테이블을 만들고 MySQL에 다른 테이블의 기본 키를 참조하도록 지시하고 있지만 해당 테이블은 아직 존재하지 않습니다.

예를 들어 작성자와 수업 표를 먼저 작성해야 합니다.

테이블을 만드는 순서는 장인과 마이그레이션 파일을 만든 순서에 따라 달라집니다.

제 의견은 모든 테이블의 데이터베이스를 비우고 마이그레이션 파일 이름의 타임스탬프를 변경(또는 삭제하고 올바른 순서로 다시 만들기)하여 작성자와 수업 테이블이 튜토리얼 테이블 이전에 작성되도록 하는 것입니다.

참조된 테이블의 테이블 유형을 InnoDB로 설정하는 것을 잊어버려서 동일한 오류가 발생했습니다.

$table->engine = 'InnoDB';

Laravel5, MySQL55, CentOS65

제 경우에는 이와 같은 오류가 있었습니다.

오류: [조명\데이터베이스\"쿼리 예외]
SQLSTATE]HY000]:일반 오류: 1005 테이블 'nabsh' 만들 수 없습니다.# #sql-5b0_e' (errno: 121) (Sql: artertable)usermeta 자 meta_uid가uid) users(id( ) 삭제 캐스케이드).

이 문제의 승인된 답변에서 좋은 팁을 찾았습니다. 오류: 오류 1005: 테이블을 만들 없습니다(errno: 121).

팁: 이미 다른 곳에서 사용 중인 이름으로 제약 조건을 추가하려는 경우 이 메시지가 표시됩니다.

제 경우 이 오류는 추가하려고 시도한 제약 조건이 이미 어딘가에 존재한다는 것을 의미합니다(하지만 어디에서도 볼 수 없었습니다).

출력 오류 쿼리를 복사하여 sequel pro 내에서 실행했는데, 동일한 오류가 다시 나타났기를 바랍니다.팁에 따르면 제약 조건 이름을 다른 것으로 변경한 후 오류 없이 영향을 미쳤기 때문에 laravel5 + MySQL55 + Cent에서 제약 조건 이름 작성기에 문제가 있습니다.OS65.

해결책: 테이블 스키마의 외부 메서드에서 두 번째 매개 변수를 전송하여 제약 조건의 이름을 변경합니다.

Schema::table('tutorials', function($table)
{
    $table->foreign('author')->references('id')->on('users');
    $table->foreign('lesson')->references('id')->on('lessons');
});

->로

Schema::table('tutorials', function($table)
{
    $table->foreign('author', 'fk_tutorials_author')->references('id')->on('users');
    $table->foreign('lesson', 'fk_tutorials_lesson')->references('id')->on('lessons');
});

도움이 되었으면 좋겠습니다.제 경우에는 효과가 있습니다.

가장 쉬운 방법은 외부 키 검사를 비활성화하는 것입니다.

DB::statement('set foreign_key_checks=0');

Schema::table( ... );

DB::statement('set foreign_key_checks=1');

Yii Framework 1.x 마이그레이션에서도 이런 일이 발생했습니다.위의 Laravel 솔루션과 유사한 것이 원인일 수 있다는 것이 밝혀졌습니다.

  • 잘못된 철자(또는 아직 존재하지 않음) 테이블 이름
  • 철자가 잘못되었거나 아직 존재하지 않는 열 이름
  • 동일한 데이터베이스에서 다른 테이블에서 사용 중인 외국 키 이름 복제

외국 키를 사용할 때 - 외국 키가 다음과 같은지 확인합니다.unsigned가 있었어요 이것은 나에게 효과가 있었습니다.

라라벨 5에서 하는 일은 이렇습니다.

// CREATING TABLE
Schema::create('your_table_name', function (Blueprint $table) {
    $table->engine = 'InnoDB';
    $table->increments('id'); // index field example sample
    $table->string('field2'); // some varchar/string field sample
    $table->integer('field3'); // some integer field sample
    $table->integer('field_some_table_id')->unsigned; //for field that contains foreign key constraint
});

// FOREIGN KEY CONSTRAINT
Schema::table('stock', function ($table) {
    $table->foreign('field_some_table_id')->references('id')->on('some_table')->onDelete('cascade')->onUpdate('cascade');
});

결론은 여기까지이고, 저는 그것이 통합니다.

다음과 같이 정수에 Laravel 5.4의 부호 없는 플래그를 부여해야 합니다.

public function up()
{
    Schema::create('posts', function (Blueprint $table) {
        $table->increments('post_id');
        $table->text('title');
        $table->text('text');
        $table->integer('employee_post_id_number')->unsigned();
        $table->foreign('employee_post_id_number')->references 
        ('employee_id_number')->on('employees');
        $table->timestamps();
    });
}

기본적으로 migration 명령은 테이블에 대해 제공하는 FK 참조와 일치하지 않는 순서로 테이블을 생성하기 때문에 이러한 오류가 발생합니다.

사용자 테이블의 id를 참조해야 하는 FK를 생성하려면 사용자 테이블이 존재해야 합니다.

예를 들어 작성자와 수업 표를 먼저 작성해야 합니다.

그래서 FK를 기존의 테이블에 성공적으로 참조할 수 있는 테이블(한 개씩)을 순서대로 작성하여 이를 해결했습니다.그래서 PHP Artisan Migration은 순서를 결정할 수 없습니다.

또 다른 솔루션으로는 migration 명령에서 제공하는 테이블이나 타임스탬프의 이름을 간단히 바꿀 수 있습니다.

사용 방법:

 $table->unsignedInteger('author');

대신:

 $table->integer('author');

그 문제는 해결될 것입니다.

문제는 정수가 int(11) 변수를 생성하는 반면 int(10) 변수가 필요하다는 것입니다.무기명의정수가 당신을 대신해 줄 겁니다.

이 오류의 원인 중 하나는 마이그레이션 파일의 시간과 날짜 작성일 수 있습니다.예를 들어, 일부 태스크 그룹에 속하는 태스크가 있는 경우 "create_tasks_table"과 같은 참조가 있습니다.

$table->id();
        $table->string('task_name');
        $table->integer('task_group')->unsigned();
        $table->foreign('task_group')
            ->references('id')->on('tasks_groups')->onDelete('cascade');
        $table->longText('task_desc');...."

tasks_groups에 대한 마이그레이션 파일을 먼저 만드는 것이 중요합니다(파일 이름으로 우리는 생성 시간과 날짜를 볼 수 있습니다). 그리고 우리는 일부 tasks_groups에 속하는 작업을 만들어야 합니다.

또한 다음과 같은 관계로 마이그레이션 파일을 구성하는 것이 좋습니다.

enter codeOne of the reasons for this error can be the time and date creation of the migration files. For example , if we have tasks which belongs to some tasks groups, and there is references like:

"create_tasks_table

        $table->id();
        $table->string('task_name');
        $table->integer('task_group')->unsigned();
        $table->foreign('task_group')
            ->references('id')->on('tasks_groups')->onDelete('cascade');
        $table->longText('task_desc');...."

tasks_groups에 대한 마이그레이션 파일을 먼저 만드는 것이 중요합니다(파일 이름으로 우리는 생성 시간과 날짜를 볼 수 있습니다). 그리고 우리는 일부 tasks_groups에 속하는 작업을 만들어야 합니다.

또한.

마이그레이션 테이블은 다음과 같이 표시되어야 합니다.

'일루미네이트\데이터베이스 사용\'마이그레이션\Migration; 일루미네이트\데이터베이스 사용\스키마\Blueprint; 일루미네이트 사용\서포트\파사드\스키마;

class CreateTasksTable은 마이그레이션 { /** * 마이그레이션을 실행합니다.* * @return void */ public function up() { 스키마::create('tasks_groups', 함수(Blueprint $table) { $table->increments('id'); $table->string('group_name'); $table->string('lug'); $table->time stamps(); };

    Schema::create('tasks', function (Blueprint $table) {
        $table->id();
        $table->string('task_name');
        $table->integer('task_group')->unsigned();
        $table->foreign('task_group')
            ->references('id')->on('tasks_groups')->onDelete('cascade');
        $table->longText('task_desc');
        $table->string('izvrsioc');
        $table->string('ulogovani_rukovodioc');
        $table->date('time_finishingtask');
        $table->string('prioritet_izrade')->default('');
        $table->string('file_1')->nullable();
        $table->string('file_path1')->nullable();
        $table->string('file_2')->nullable();
        $table->string('file_path2')->nullable();
        $table->string('file_3')->nullable();
        $table->string('file_path3')->nullable();
        $table->longText('dodatni_komentar');
        $table->boolean('zavrsen_task')->default(false);
        $table->boolean('otkazan_task')->default(false);
        $table->timestamps();
    });
}

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

}`

관계가 있다면 더 좋습니다.

저는 이 문제에 직면하고 있었습니다. 관계 예제를 나타내기 위해 추가하는 열로 ->unsigned()를 추가했습니다. errorr $table->integer('수업');

오른쪽은 $table-> integer('lesson'->부호 ();

언급URL : https://stackoverflow.com/questions/11894250/general-error-1005-cant-create-table-using-laravel-schema-build-and-foreign

반응형