はじめに
マイグレーションファイルを修正して実行しようとしたところ、
「Invalid datetime format: 1292 Incorrect date value」とエラーが出たので、対応策をまとめます。
環境
Laravel 9.52.16
問題
- 入力フォームに新たに日付を追加したい
- そのためマイグレーションファイルを修正
- しかし上手く実行できない
マイグレーションファイル
<?php
use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;
return new class extends Migration
{
/**
* Run the migrations.
*
* @return void
*/
public function up()
{
Schema::table('sales_orders', function (Blueprint $table) {
$table->string('category');
$table->decimal('budget', 10);
$table->date('schedule');
});
}
/**
* Reverse the migrations.
*
* @return void
*/
public function down()
{
Schema::table('sales_orders', function (Blueprint $table) {
$table->dropColumn('category');
$table->dropColumn('budget');
$table->dropColumn('schedule');
});
}
};
エラー
Illuminate\Database\QueryException
SQLSTATE[22007]: Invalid datetime format: 1292 Incorrect date value: '0000-00-00' for column 'schedule' at row 1
(SQL: alter table `sales_orders` add `category` varchar(255) not null, add `budget` decimal(10, 2) not null, add `schedule` date not null)
原因と解決策
- 既存のレコードにdateを挿入しようとしたとき、デフォルトの値がないためエラーが発生している
自分の場合、事前にテストレコードを作成していました。
そこには当然今回追加しようとしているscheduleカラムなどは存在しません。
よってマイグレーション実行時に事前に定めるデフォルトの値を設定しようとします。
しかし自分はデフォルトの値を設定していないので、エラーが発生しています。
対応策①:NULLを許容する
scheduleカラムのデフォルト値のNULLを許容する方法です。
これにより、既存のレコードに対してscheduleカラムを追加すると、そこにはNULLが設定されます。
例(マイグレーションファイル内)
// 中略
$table->date('schedule')->nullable();
対応策②:デフォルト値を設定する
scheduleカラムにデフォルト値を設定する方法です。
ただしデフォルト値を設定する場合は、その値が意図する値であるか精査する必要があります。
例(マイグレーションファイル)
// 中略
$table->date('schedule')->default(DB::raw('CURRENT_DATE'));
例えばこのコードではデフォルト値としてCURRENT_DATE(現在時刻)が入ります。
おわりに
自分はNULLを許容することで対応しましたが、NULL許容は不自然な挙動時の原因把握を難しくする可能性があります。
テストレコード数件程度であれば、一旦全部削除するのもアリかなと思いました。