alter all tables将default value设置为null

时间:2016-12-19 12:34:13

标签: mysql laravel

由于我们旧的laravel应用程序中的旧迁移,许多$table->timestamps();的默认值为0000-00-00 00:00:00。由于我们的新mysql版本不允许这样的日期作为时间戳的默认值,我们必须更改所有表以设置created_at和{{1}的默认值所有表格的列updated_at

Laravel如何在迁移文件中完成此任务?

  • 循环遍历所有表并检查是否有NULLcreated_at列并将其默认值设置为updated_at或将时间戳设置为可空的方法?
  • 遍历所有NULLcreated_at列并将其值设置为updated_at

任何人都可以帮助我吗? : - )

2 个答案:

答案 0 :(得分:0)

尝试这样的操作(在更改列之前,请确保将doctrine/dbal依赖项添加到composer.json文件中。):

$tables = DB::select('SHOW TABLES'); // returns an array of tables
foreach($tables as $table) {
    Schema::table($table, function ($t) {
        $t->nullableTimestamp('created_at')->change();
        $t->nullableTimestamp('updated_at')->change();
    });
}

答案 1 :(得分:0)

您可以看一下:https://laravel.com/docs/5.3/migrations#modifying-columns

您可以生成update_users_table之类的新迁移,以便将$ up方法放在$ table上的nullableTimestamps方法中,如下所示:

Schema::table('users', function ($table) {
    $table->nullableTimestamps()->useCurrent()->change();
});

来源:https://laravel.com/docs/5.3/upgrade#upgrade-5.3.0

MySQL日期

从MySQL 5.7开始,由于默认情况下启用了严格模式,因此00:00:00不再被视为有效日期。将记录插入数据库时​​,所有时间戳列都应接收有效的默认值。您可以在迁移中使用useCurrent方法将timestamp列默认为当前时间戳,或者可以使时间戳可以为空以允许空值:

$table->timestamp('foo')->nullable();

$table->timestamp('foo')->useCurrent();

$table->nullableTimestamps();