Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Bagaimana Saya Dapat Menyetel Nilai Default Kolom Timestamp ke Timestamp Saat Ini dengan Laravel Migrations?

Mengingat itu adalah ekspresi mentah, Anda harus menggunakan DB::raw() untuk menyetel CURRENT_TIMESTAMP sebagai nilai default untuk kolom:

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

Ini bekerja dengan sempurna pada setiap driver database.

Pada Laravel 5.1.25 (lihat PR 10962 dan melakukan 15c487fe ) sekarang Anda dapat menggunakan useCurrent() new yang baru metode pengubah kolom untuk mencapai nilai default yang sama untuk kolom:

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

Kembali ke pertanyaan, di MySQL Anda juga bisa menggunakan ON UPDATE klausa melalui DB::raw() :

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

Sekali lagi, pada Laravel 8.36.0 (lihat PR 36817 ) sekarang Anda dapat menggunakan useCurrentOnUpdate() yang baru metode pengubah kolom bersama dengan useCurrent() pengubah untuk mencapai nilai default yang sama untuk kolom:

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

Gotcha

  • MySQL

    Dimulai dengan MySQL 5.7, 0000-00-00 00:00:00 tidak lagi dianggap sebagai tanggal yang valid. Seperti yang didokumentasikan di Panduan peningkatan versi Laravel 5.2 , semua kolom stempel waktu akan menerima nilai default yang valid saat Anda memasukkan catatan ke dalam database Anda. Anda dapat menggunakan useCurrent() pengubah kolom (dari Laravel 5.1.25 dan di atasnya) dalam migrasi Anda ke default kolom stempel waktu ke stempel waktu saat ini, atau Anda dapat membuat stempel waktu nullable() untuk mengizinkan nilai nol.

  • PostgreSQL &Laravel 4.x

    Dalam versi Laravel 4.x, driver PostgreSQL menggunakan presisi database default untuk menyimpan nilai timestamp. Saat menggunakan CURRENT_TIMESTAMP fungsi pada kolom dengan presisi default, PostgreSQL menghasilkan stempel waktu dengan presisi lebih tinggi yang tersedia, sehingga menghasilkan stempel waktu dengan bagian kedua pecahan - lihat biola SQL ini .

    Ini akan menyebabkan Carbon gagal mengurai cap waktu karena tidak akan mengharapkan mikrodetik disimpan. Untuk menghindari perilaku tak terduga yang merusak aplikasi Anda, Anda harus secara eksplisit memberikan presisi nol pada CURRENT_TIMESTAMP fungsi seperti di bawah ini:

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

    Sejak Laravel 5.0, timestamp() kolom telah diubah untuk menggunakan presisi default nol yang menghindari hal ini.

Terima kasih kepada @andrewhl untuk menunjukkan masalah Laravel 4.x di komentar.

Terima kasih kepada @ChanakaKarunarathne untuk mengeluarkan useCurrentOnUpdate() new yang baru pintasan di komentar.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Mendapatkan Catatan Bulan Ini di MySQL

  2. MySql memperbarui dua tabel sekaligus

  3. Menggunakan Hitungan untuk menemukan jumlah kemunculan

  4. Apakah SQL Server Menawarkan Apa Pun Seperti MySQL's ON DUPLICATE KEY UPDATE?

  5. Bagaimana menghubungkan ke MySQL menggunakan Microsoft .NET