sql >> データベース >  >> RDS >> Mysql

Laravelの移行でタイムスタンプ列のデフォルト値を現在のタイムスタンプに設定するにはどうすればよいですか?

    生の式であるため、DB::raw()を使用する必要があります CURRENT_TIMESTAMPを設定します 列のデフォルト値として:

    $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP'));
    

    これは、すべてのデータベースドライバーで問題なく機能します。

    Laravel 5.1.25以降( PR10962 を参照 および commit 15c487fe )新しいuseCurrent()を使用できるようになりました 列に同じデフォルト値を実現するための列修飾子メソッド:

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

    質問に戻ると、MySQLではON UPDATEを使用することもできます DB::raw()を介した句 :

    $table->timestamp('updated_at')->default(DB::raw('CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP'));
    

    繰り返しになりますが、Laravel 8.36.0以降( PR 36817 を参照) )新しいuseCurrentOnUpdate()を使用できるようになりました useCurrent()と一緒の列修飾子メソッド 列に同じデフォルト値を実現するための修飾子:

    $table->timestamp('updated_at')->useCurrent()->useCurrentOnUpdate();
    

    ゴッチャ

    • MySQL

      MySQL 5.7以降、0000-00-00 00:00:00 有効な日付とは見なされなくなりました。 Laravel5.2アップグレードガイド に記載されています 、データベースにレコードを挿入するとき、すべてのタイムスタンプ列は有効なデフォルト値を受け取る必要があります。 useCurrent()を使用できます 移行時に列修飾子(Laravel 5.1.25以降)を使用して、タイムスタンプ列を現在のタイムスタンプにデフォルト設定するか、タイムスタンプをnullable()にすることができます。 null値を許可します。

    • PostgreSQL&Laravel 4.x

      Laravel 4.xバージョンでは、PostgreSQLドライバーはデフォルトのデータベース精度を使用してタイムスタンプ値を保存していました。 CURRENT_TIMESTAMPを使用する場合 デフォルトの精度で列の関数を実行すると、PostgreSQLは利用可能なより高い精度のタイムスタンプを生成するため、2番目の部分が分数のタイムスタンプを生成します-このSQLフィドルを参照

      これにより、Carbonはマイクロ秒が格納されることを期待しないため、タイムスタンプの解析に失敗します。この予期しない動作によってアプリケーションが破損するのを防ぐには、CURRENT_TIMESTAMPに明示的にゼロの精度を与える必要があります。 以下のように機能します:

        $table->timestamp('created_at')->default(DB::raw('CURRENT_TIMESTAMP(0)'));
      

      Laravel 5.0以降、timestamp() 列は、これを回避するデフォルトの精度ゼロを使用するように変更されました。

    @andrewhl に感​​謝します コメントでLaravel4.xの問題を指摘してくれました。

    @ChanakaKarunarathne に感​​謝します 新しいuseCurrentOnUpdate()を引き出すため コメントのショートカット。



    1. Ubuntu20.04にArangoDBをインストールする方法

    2. SQL Serverで先行ゼロをトリミングするためのより良い手法はありますか?

    3. PostgreSQLで英数字のみを含む行を返す2つの方法

    4. SQLキャスト日時