0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

「Invalid datetime format: 1292 Incorrect date value」への対応法

Posted at

はじめに

マイグレーションファイルを修正して実行しようとしたところ、

「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許容は不自然な挙動時の原因把握を難しくする可能性があります。

テストレコード数件程度であれば、一旦全部削除するのもアリかなと思いました。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?