sql >> Databasteknik >  >> RDS >> Mysql

Hur kan jag ställa in standardvärdet för en tidsstämpelkolumn till den aktuella tidsstämpeln med Laravel-migreringar?

Med tanke på att det är ett råuttryck bör du använda DB::raw() för att ställa in CURRENT_TIMESTAMP som standardvärde för en kolumn:

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

Detta fungerar felfritt på alla databasdrivrutiner.

Från och med Laravel 5.1.25 (se PR 10962 och commit 15c487fe ) kan du nu använda den nya useCurrent() kolumnmodifieringsmetod för att uppnå samma standardvärde för en kolumn:

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

Tillbaka till frågan, på MySQL kan du också använda ON UPDATE klausul genom DB::raw() :

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

Återigen, från och med Laravel 8.36.0 (se PR 36817 ) kan du nu använda den nya useCurrentOnUpdate() kolumnmodifieringsmetoden tillsammans med useCurrent() modifierare för att uppnå samma standardvärde för en kolumn:

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

Gotchas

  • MySQL

    Börjar med MySQL 5.7, 0000-00-00 00:00:00 anses inte längre vara ett giltigt datum. Som dokumenterats i Laravel 5.2 uppgraderingsguide , bör alla tidsstämpelkolumner få ett giltigt standardvärde när du infogar poster i din databas. Du kan använda useCurrent() kolumnmodifierare (från Laravel 5.1.25 och senare) i dina migreringar för att förinställa tidsstämpelkolumnerna till de aktuella tidsstämplarna, eller så kan du göra tidsstämplarna nullable() för att tillåta nollvärden.

  • PostgreSQL &Laravel 4.x

    I Laravel 4.x-versioner använde PostgreSQL-drivrutinen standarddatabasprecisionen för att lagra tidsstämpelvärden. När du använder CURRENT_TIMESTAMP funktion på en kolumn med en standardprecision, PostgreSQL genererar en tidsstämpel med den högre precisionen som är tillgänglig, vilket genererar en tidsstämpel med en bråkdel av andra delen - se denna SQL-fiol .

    Detta kommer att leda till att Carbon misslyckas med att analysera en tidsstämpel eftersom den inte förväntar sig att mikrosekunder lagras. För att undvika att detta oväntade beteende bryter din ansökan måste du uttryckligen ge en nollprecision till CURRENT_TIMESTAMP fungerar enligt nedan:

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

    Sedan Laravel 5.0, timestamp() kolumner har ändrats för att använda standardprecisionen noll som undviker detta.

Tack vare @andrewhl för att du påpekade problemet med Laravel 4.x i kommentarerna.

Tack vare @ChanakaKarunarathne för att ta fram den nya useCurrentOnUpdate() genväg i kommentarerna.



  1. Hur ändrar du datatypen för en kolumn i SQL Server?

  2. Säkerhetskopiera/exportera en databas från SSH

  3. Hur man använder Virtual Index i Oracle Database

  4. Hur man säkrar Galera Cluster - 8 tips