Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm cách nào để tôi có thể đặt Giá trị mặc định của cột dấu thời gian thành Dấu thời gian hiện tại với Laravel Migrations?

Vì đó là một biểu thức thô, bạn nên sử dụng DB::raw() để đặt CURRENT_TIMESTAMP làm giá trị mặc định cho một cột:

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

Điều này hoạt động hoàn hảo trên mọi trình điều khiển cơ sở dữ liệu.

Kể từ Laravel 5.1.25 (xem PR 10962 cam kết 15c487fe ) bây giờ bạn có thể sử dụng useCurrent() mới phương thức sửa đổi cột để đạt được cùng một giá trị mặc định cho một cột:

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

Quay lại câu hỏi, trên MySQL, bạn cũng có thể sử dụng ON UPDATE mệnh đề thông qua DB::raw() :

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

Một lần nữa, kể từ Laravel 8.36.0 (xem PR 36817 ) bây giờ bạn có thể sử dụng useCurrentOnUpdate() mới phương thức bổ trợ cột cùng với useCurrent() sửa đổi để đạt được cùng một giá trị mặc định cho một cột:

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

Gotchas

  • MySQL

    Bắt đầu với MySQL 5.7, 0000-00-00 00:00:00 không còn được coi là một ngày hợp lệ. Như đã nêu tại hướng dẫn nâng cấp Laravel 5.2 , tất cả các cột dấu thời gian sẽ nhận giá trị mặc định hợp lệ khi bạn chèn bản ghi vào cơ sở dữ liệu của mình. Bạn có thể sử dụng useCurrent() công cụ sửa đổi cột (từ Laravel 5.1.25 trở lên) trong quá trình di chuyển của bạn để mặc định các cột dấu thời gian thành dấu thời gian hiện tại hoặc bạn có thể đặt dấu thời gian nullable() để cho phép các giá trị rỗng.

  • PostgreSQL &Laravel 4.x

    Trong các phiên bản Laravel 4.x, trình điều khiển PostgreSQL đang sử dụng độ chính xác cơ sở dữ liệu mặc định để lưu trữ các giá trị dấu thời gian. Khi sử dụng CURRENT_TIMESTAMP chức năng trên cột có độ chính xác mặc định, PostgreSQL tạo dấu thời gian có độ chính xác cao hơn hiện có, do đó tạo dấu thời gian có phần thứ hai phân số - xem câu hỏi thường gặp về SQL này .

    Điều này sẽ khiến Carbon không phân tích được dấu thời gian vì nó sẽ không mong đợi micro giây được lưu trữ. Để tránh hành vi không mong muốn này phá vỡ ứng dụng của bạn, bạn phải đặt rõ ràng độ chính xác bằng 0 cho CURRENT_TIMESTAMP chức năng như sau:

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

    Kể từ Laravel 5.0, timestamp() các cột đã được thay đổi để sử dụng độ chính xác mặc định bằng 0, tránh được điều này.

Cảm ơn @andrewhl vì đã chỉ ra vấn đề Laravel 4.x trong các nhận xét.

Cảm ơn @ChanakaKarunarathne để đưa ra useCurrentOnUpdate() mới phím tắt trong nhận xét.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Xuất cơ sở dữ liệu MySQL bằng PHP

  2. Các cột trong bảng có Khóa ngoại có thể là NULL không?

  3. MySQL:không có trong GROUP BY

  4. Bảo mật cài đặt MySQL của bạn

  5. 10 câu hỏi phỏng vấn cơ sở dữ liệu MySQL cho người mới bắt đầu và người trung gian