Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak ustawić domyślną wartość kolumny sygnatury czasowej na bieżący datownik za pomocą migracji Laravel?

Biorąc pod uwagę, że jest to surowe wyrażenie, powinieneś użyć DB::raw() aby ustawić CURRENT_TIMESTAMP jako wartość domyślna dla kolumny:

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

Działa to bezbłędnie na każdym sterowniku bazy danych.

Od Laravel 5.1.25 (patrz PR 10962 i zatwierdź 15c487fe ) możesz teraz używać nowej useCurrent() metoda modyfikatora kolumny w celu uzyskania tej samej wartości domyślnej dla kolumny:

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

Wracając do pytania, w MySQL możesz również użyć ON UPDATE klauzula przez DB::raw() :

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

Ponownie, od wersji Laravel 8.36.0 (patrz PR 36817 ) możesz teraz używać nowego useCurrentOnUpdate() metoda modyfikatora kolumny wraz z useCurrent() modyfikator, aby uzyskać tę samą domyślną wartość dla kolumny:

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

Gotcha

  • MySQL

    Począwszy od MySQL 5.7, 0000-00-00 00:00:00 nie jest już uważana za prawidłową datę. Jak opisano w przewodniku aktualizacji Laravel 5.2 , wszystkie kolumny sygnatury czasowej powinny otrzymać prawidłową wartość domyślną podczas wstawiania rekordów do bazy danych. Możesz użyć useCurrent() modyfikator kolumn (z Laravel 5.1.25 i nowszych) w twoich migracjach do domyślnych kolumn sygnatury czasowej na bieżące sygnatury czasowe lub możesz ustawić sygnatury czasowe nullable() aby zezwolić na wartości null.

  • PostgreSQL i Laravel 4.x

    W wersjach Laravel 4.x sterownik PostgreSQL używał domyślnej precyzji bazy danych do przechowywania wartości znaczników czasu. Podczas korzystania z CURRENT_TIMESTAMP funkcji na kolumnie z domyślną precyzją, PostgreSQL generuje znacznik czasu o wyższej dostępnej precyzji, generując w ten sposób znacznik czasu z ułamkową drugą częścią - zobacz te skrzypce SQL .

    Doprowadzi to do tego, że Carbon nie przeanalizuje znacznika czasu, ponieważ nie będzie oczekiwał przechowywania mikrosekund. Aby uniknąć tego nieoczekiwanego zachowania powodującego uszkodzenie aplikacji, musisz jawnie podać zerową precyzję CURRENT_TIMESTAMP funkcja jak poniżej:

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

    Od Laravela 5.0 timestamp() kolumny zostały zmienione tak, aby używały domyślnej precyzji zero, co pozwala uniknąć tego.

Podziękowania dla @andrewhl za zwrócenie uwagi na problem Laravel 4.x w komentarzach.

Podziękowania dla @ChanakaKarunarathne za wprowadzenie nowego useCurrentOnUpdate() skrót w komentarzach.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Błąd MySQL 1436:Przepełnienie stosu wątków za pomocą prostego zapytania

  2. Jak przekonwertować datetime na UTC w MySQL

  3. Jak mogę zmienić rozmiar kolumny w tabeli MySQL?

  4. Jak włączyć dziennik zapytań MySQL?

  5. Używanie unii i kolejności według klauzuli w mysql