2017-03-08 10 views
3

오류가 발생했습니다. 문자열에서 텍스트로 열을 입력하려고하면 Laravel의 마이그레이션 기능이 사용됩니다.이전 컬럼 변경 유형은 어떻게됩니까?

파일 : {data_time} _change_db_structure.php

public function up() 
    { 
    Schema::table('service_request_type', function (Blueprint $table) { 
     $table->dropIndex(['sro_key_group']); 

     $table->text('sro_key_group')->change(); 
     $table->renameColumn('sro_key_group', 'tags'); 
    }); 
    } 

이 테이블 파일을 orginal 한 마이그레이션 생성된다.

public function up() 
    { 
    Schema::create('service_request_type', function (Blueprint $table) { 
     $table->engine = 'InnoDB'; 
     ... 
     $table->string('sro_key_group', 100)->nullable()->index(); 
     ... 
    }); 
    } 

오류가 발생했습니다.

[를 분명히 \ 데이터베이스 \의 QueryException]
SQLSTATE [42000] : 구문 오류 또는 액세스 위반 : 1170 BLOB/TEXT 열 키 길이 없이 키 명세서에서 사용되는 'sro_key_group'(SQL : ALTER TABLE의 service_request_type CHANGE sro_key_group SRO _key_group 텍스트의 DEFAULT NULL의 부씩 utf8_unicode_ci)

                                  [Doctrine\DBAL\Driver\PDOException]         

SQLSTATE [42,000] : 구문 오류 또는 액세스 위반 : 1,170 BLOB/TEXT 열없이 키 명세서에서 사용되는 'sro_key_group' 키 길이

                                  [PDOException]               

SQLSTATE [42000] : 구문 오류 또는 액세스 위반 : 1170 BLOB/TEXT 열 키 길이

무슨 일없이 키 명세서에서 사용되는 'sro_key_group'? 그리고 이미 내 composer.jsondoctrine/dbal을 설치합니다.

+0

복수 색인에서'sro_key_group'입니까? – patricus

+0

@patricus'sro_key_group'은 다중 인덱스가 아닙니다 – ThunderBirdsX3

+0

@ ThunderBirdsX3이 부분을 참조하십시오 http://stackoverflow.com/questions/1827063/mysql-error-key-specification-without-a-key-length –

답변

2

세 가지 별도 마이그레이션 중 하나를 사용하거나 대답에 표시된대로 table()을 세 번 호출해야합니다.

첫 번째 문제는 명령문을 실행하려는 순서대로 (그리고 명령을 실행해야하는 순서대로) 작성한 경우에도 스키마 작성기가 실제로 순서를 재 배열하여 "변경 "문장이 먼저 실행됩니다. 스키마 빌더는 새 열과 변경된 열을 "묵시적인"명령문으로 처리하고이를 명령 스택의 맨 위로 이동하여 실행합니다. 그러나 이름 변경 명령문은 "변경"명령문으로 간주되지 않습니다. 열이 제거되기 전에 변경 명령이 일어나고 있기 때문에,

[ 
    change column from varchar to text, 
    remove index, 
    rename column, 
] 

지금 : 스키마 빌더가 실제로 실행됩니다

[ 
    remove index, 
    change column from varchar to text, 
    rename column, 
] 

: 당신이에 코드를 작성했습니다에도 불구하고 그래서

, 인덱스에서 1170 오류가 발생합니다.

다음 문제는 동일한 컨텍스트에서 열 변경과 열 이름 바꾸기를 시도하는 것입니다.요청 변경을 구현하는 SQL은 스키마 diff를 수행하여 생성되지만, 스키마 변경은 실제로 변경하기 전에 완료됩니다. 따라서 varchar에서 text으로 변경하면 해당 SQL이 생성되어 해당 이름을 변경하지만 열 이름을 변경하는 동안 실제로 열을 변경하는 SQL을 생성하여 이름을 바꾸는 동안 텍스트 필드에을 다시 입력합니다.

이러한 문제를 해결하려면 첫 번째 마이그레이션이 인덱스를 삭제하고 두 번째 마이그레이션이 유형을 변경 한 다음 세 번째 마이그레이션이 이름을 변경하거나 한 번의 마이그레이션을 유지하고 실행할 수있는 세 가지 마이그레이션을 만들 수 있습니다 세 table() 문.

public function up() 
{ 
    // make sure the index is dropped first 
    Schema::table('service_request_type', function (Blueprint $table) { 
     $table->dropIndex(['sro_key_group']); 
    }); 

    // now change the type of the field 
    Schema::table('service_request_type', function (Blueprint $table) { 
     $table->text('sro_key_group')->nullable()->change(); 
    }); 

    // now rename the field 
    Schema::table('service_request_type', function (Blueprint $table) { 
     $table->renameColumn('sro_key_group', 'tags'); 
    }); 
} 
+0

와우 대단한 !! 고맙습니다. – ThunderBirdsX3

+0

흠,'sro_key_group'이 답안의'text'로 바뀌지 않은 것처럼 보입니다.하지만 제 답변에서는 작동합니다. – ThunderBirdsX3

+0

@ ThunderBirdsX3 나는 왜 그런 일이 일어나고 있는지에 대한 좀 더 많은 정보를 가지고 나의 대답을 업데이트했다. – patricus

0

Ahhhhhh mannnnn ...

나는 대답을 얻었다.

public function up() 
    { 
    Schema::table('service_request_type', function (Blueprint $table) { 
     $table->dropIndex(['sro_key_group']); 
    }); 
    Schema::table('service_request_type', function (Blueprint $table) { 
     $table->text('sro_key_group')->nullable()->change(); 
    }); 
    Schema::table('service_request_type', function (Blueprint $table) { 
     $table->renameColumn('sro_key_group', 'tags'); 
    }); 
    } 

Hmmmmmmm WTF가 맞습니까?

+0

나는 무엇이 일어나는지 알고있다. 나는 대답을 쓸거야. – patricus

+0

문제가 발생한 이유를 알려주는 답변을 게시했습니다. – patricus