2017-10-21 2 views
3

Es scheint es eine Bruch Änderung in MariaDB ist 10.2.7, wenn Sie versuchen, ein Feld auf NULL festlegbare Datetime-Spalte zu umbenennen und Sie erhalten eine Fehlermeldung, wenn Sie eine Migration ausführen:Laravel Migration umbenennen Nullable Field Workaround?

[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') 

Migration erstellen:

class CreateTestTable extends Migration 
{ 
    public function up() 
    { 
     Schema::create('test', function (Blueprint $table) { 
      $table->increments('id'); 
      $table->dateTime('dueDate')->nullable(); 
     }); 
    } 
} 

eine zweite Migration erstellen Sie die Spalte umbenennen:

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

gibt es eine Abhilfe diese Arbeit zu bekommen?

Nach Lehre/dbal issue:

Um Ausdrücke als Standardwerte zu ermöglichen, und unterscheiden sie von Literalen, MariaDB zitiert nun Standardwerte in information_schema.column Tabelle. Diese Änderung bringt eine Menge von Inkompatibilitäten zwischen den (Oracle-) Mysql/MariaDB-Plattformen mit sich.

Anstatt eine spezifische SchemaManager für MariaDB zu schaffen, ist die Lösung in diesem P genommen/R der eingeführten Änderungen in der aktuellen MySQLSchemaManager abzubilden (Methode: getMariaDb1027ColumnDefault()).

Von MariaDB 10.2.7, Informationen Schemaänderungen enthält:

NULL jetzt als 'NULL' zitiert wird (Ausnahme, wenn colum nicht standardmäßig NULL-Werte zulässt und kein Standard zur Verfügung gestellt: NULL wird in information_schema gespeichert), EDIT : siehe Ausnahme https://jira.mariadb.org/browse/MDEV-14053 String-Standardwerte sind in Anführungszeichen (Um die Zeichenfolge 'NULL' zu speichern, setzen Sie den Standardwert auf '' NULL ''). Escaping: "'" werden im Informationsschema automatisch in "' '" geändert. Dies sollte keine Auswirkungen haben, es sei denn, Sie manuell Standardwerte mit "'" in Ihre Modelle (Schema diff). Siehe auch Punkt 5. Standard-Literalwerte müssen in Anführungszeichen gesetzt werden, was die Unterstützung für automatische CURRENT_TIMESTAMP, CURRENT_DATE, CURRENT_TIME-Standardwerte automatisch in 'current_timestamp()', 'currdate()', 'currtime()' bringt. Um das Schema diff zu verhindern, werden sie auf ihre ursprünglichen Werte zurückgesetzt.

+0

Haben Sie versucht '$ Tabelle-> UmbenennenColumn ('Fälligkeitsdatum', 'Fälligkeitsdatum') -> Nullable()'? –

+0

Haben Sie versucht, die Spalte nicht nullbar zu machen, umzubenennen und sie dann wieder nullfähig zu machen? '$ table-> Nullable (false) -> change()' –

Antwort

1

Sie versuchen, diesen Ansatz könnten: query

erstellen neue Spalte und führen

Werte von Ihrem alten Spalte in Ihre neue Spalte

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

kopieren Obwohl die bereitgestellten Lösungen arbeiten ich einen einfacheren Ansatz bevorzugen :

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