2017-10-21 63 views
3

它似乎有在MariaDB的10.2.7重大更改,如果你試圖重命名爲空的領域datetime列,如果你運行遷移,你會得到一個錯誤:Laravel遷移重命名可空字段解決方法?

[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 CreateTestTable extends Migration 
{ 
    public function up() 
    { 
     Schema::create('test', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->dateTime('dueDate')->nullable(); 
     }); 
    } 
} 

創建第二個遷移,重命名列:

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

是否有變通方法來得到這個工作?

根據教義/ DBAL issue

爲了讓表達式爲默認值,從字面區分 ,MariaDB的報價目前在 information_schema.column表中的默認值。 (Oracle-)Mysql/MariaDB平臺之間的這種變化會帶來很多 不兼容。

相反創建MariaDB的特定SchemaManager的,在該p採取的溶液 /R是映射在當前 MySQLSchemaManager引入的變化(方法:getMariaDb1027ColumnDefault())。

從MariaDB的10.2.7,信息模式的變化包括:

NULL現在引述「NULL」(異常時科拉姆默認是不 可空,並沒有默認提供:NULL保存在 INFORMATION_SCHEMA),EDIT :查看例外 https://jira.mariadb.org/browse/MDEV-14053字符串默認值被引用 (要保存字符串'NULL',請將默認值設置爲'NULL'')。轉義: 「'」在信息模式中默默地變爲「''」。這應該是 不會產生影響,除非您在 模型(模式差異)中用「'」手動轉義默認值。默認文字值 必須被引用,它支持自動CURRENT_TIMESTAMP, CURRENT_DATE,CURRENT_TIME默認值默認更改爲 'current_timestamp()','currdate()','currtime()'。爲了防止模式 差異,它們被映射回它們的原始值。

+0

你嘗試過'$ table-> renameColumn('dueDate','due_date') - > nullable()'? –

+0

您是否嘗試將列設爲非空,重命名,然後再次將其設爲空? '$表 - >可空(假) - >更改()' –

回答

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;'); 
    }); 
}