2017-10-21 15 views
3
이 필드 널 (NULL) 날짜 열 이름을 변경하려고하면 마이그레이션 실행하면 오류를 얻을 것이다 경우가 mariadb 10.2.7에서 주요 변화가 나타납니다

:Laravel 마이그레이션에서 nullable 필드 해결 방법의 이름을 바꿉니 까?

class CreateTestTable extends Migration 
{ 
    public function up() 
    { 
     Schema::create('test', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->dateTime('dueDate')->nullable(); 
     }); 
    } 
} 
: 마이그레이션을 만들기

[Illuminate\Database\QueryException] 
    SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'due_date' (SQL: ALTER TABLE test 
    CHANGE dueDate due_date DATETIME DEFAULT 'NULL') 

class RenameColumn extends Migration 
{ 
    public function up() 
    { 
     Schema::table('test', function(Blueprint $table) { 
      $table->renameColumn('dueDate', 'due_date'); 
     }); 
    } 
} 

이 작업을 얻을 수있는 해결 방법이 있습니까 :

열 이름을 바꿀 두 번째 마이그레이션을 만드시겠습니까?

교리/issue dbal에 따르면 기본 값으로 표현을 허용하고 리터럴에서 그들을 를 구별하기 위해

는 Mariadb 지금 information_schema.column 테이블에 기본값을 인용한다. 이 변경으로 인해 많은 () 비 호환성이 (Oracle-) Mysql/MariaDB 플랫폼간에 발생합니다. 대신 MariaDB 대한 특정 SchemaManager를 생성

, 이것은 P 취한 용액을 /R 현재 MySQLSchemaManager의 변화를 도입하는 매핑 (방법 : getMariaDb1027ColumnDefault()).

MariaDB 10.2.7에서 정보 스키마 변경이 포함됩니다 : (콜럼 기본값은 Null을 허용하지 이며, 디폴트가 제공하지 않는 경우 예외 : NULL이 INFORMATION_SCHEMA에 저장됩니다)

NULL은 이제 'NULL'로 인용, 편집을 : 예외 참조 https://jira.mariadb.org/browse/MDEV-14053 문자열 기본값은 입니다. 'NULL'문자열을 저장하려면 기본값을 'NULL'로 설정하십시오. 이스케이프 처리 : " '"은 정보 스키마에서 자동으로 "' '"(으)로 변경됩니다. 모델 (스키마 비교)에서 " '"를 사용하여 수동으로 기본값을 이스케이프하지 않으면 에 영향을 미치지 않아야합니다. 참조 포인트 5를 참조하십시오. 디폴트 리터럴 값 은 자동 CURRENT_TIMESTAMP, CURRENT_DATE, CURRENT_TIME에 대한 지원을 제공하기 위해 인용 부호로 묶어야합니다. 기본값은 'current_timestamp()', 'currdate()', 'currtime()'으로 자동 변경됩니다. 스키마 diff를 방지하기 위해 스키마는 원래 값으로 다시 매핑됩니다.

당신이 방법을 시도 할 수
+0

$ table-> renameColumn ('dueDate', 'due_date') -> nullable()'을 사용해 보셨나요? –

+0

열을 Nullable로 만들지 못하게하고 이름을 바꾸고 다시 nullable로 만들려고 했습니까? '$ table-> nullable (false) -> change()' –

답변

1

:

하면 제공하는 솔루션은 내가 간단한 접근 방식을 선호 작동하지만 새 열

class RenameColumn extends Migration 
{ 
    public function up() 
    { 
     Schema::table('test', function(Blueprint $table){ 
      $table->dateTime('due_date')->nullable(); 
     }); 

     // copy values from column 'dueDate' to 'due_date' 
     // DB::update returns number of affected rows 
     DB::update('UPDATE `test` SET due_date = dueDate'); 

     Schema::table('test', function(Blueprint $table){ 
      $table->dropColumn('dueDate'); 
     }); 
    } 

    public function down() 
    { 
     Schema::table('test', function(Blueprint $table){ 
      $table->dateTime('dueDate')->nullable(); 
     }); 

     DB::update('UPDATE `test` SET dueDate = due_date'); 

     Schema::table('test', function(Blueprint $table){ 
      $table->dropColumn('due_date'); 
     }); 
    } 
} 
0

에 이전 열에서 값을 복사 할 새 열 및 실행 쿼리 만들기를 :

public function up() 
{ 
    Schema::table('test', function (Blueprint $table) { 
     DB::statement('ALTER TABLE `test` CHANGE `dueDate` `due_date` TIMESTAMP NULL DEFAULT NULL;'); 
    }); 
} 

public function down() 
{ 
    Schema::table('test', function (Blueprint $table) { 
     DB::statement('ALTER TABLE `test` CHANGE `dueDate` `due_date` TIMESTAMP NULL DEFAULT NULL;'); 
    }); 
}