sql >> Databáze >  >> RDS >> Mysql

Jak mohu nastavit výchozí hodnotu sloupce časového razítka na aktuální časové razítko s migrací Laravel?

Vzhledem k tomu, že se jedná o nezpracovaný výraz, měli byste použít DB::raw() nastavte CURRENT_TIMESTAMP jako výchozí hodnota pro sloupec:

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

Toto funguje bezchybně na každém ovladači databáze.

Od Laravel 5.1.25 (viz PR 10962 a commit 15c487fe ) nyní můžete použít nové useCurrent() metoda modifikátoru sloupců k dosažení stejné výchozí hodnoty pro sloupec:

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

Zpět k otázce, na MySQL můžete také použít ON UPDATE klauzule prostřednictvím DB::raw() :

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

Opět platí, že od Laravelu 8.36.0 (viz PR 36817 ) nyní můžete použít nové useCurrentOnUpdate() metoda modifikátoru sloupce spolu s useCurrent() modifikátor pro dosažení stejné výchozí hodnoty pro sloupec:

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

Mám potíže

  • MySQL

    Počínaje MySQL 5.7, 0000-00-00 00:00:00 se již nepovažuje za platné datum. Jak je zdokumentováno v průvodci upgradem Laravel 5.2 , měly by všechny sloupce časových razítek obdržet platnou výchozí hodnotu, když vkládáte záznamy do databáze. Můžete použít useCurrent() modifikátor sloupců (od Laravel 5.1.25 a vyšší) ve vašich migracích na výchozí nastavení sloupců časových značek na aktuální časová razítka, nebo můžete časová razítka nastavit na nullable() pro povolení hodnot null.

  • PostgreSQL a Laravel 4.x

    Ve verzích Laravel 4.x používal ovladač PostgreSQL výchozí databázovou přesnost k ukládání hodnot časového razítka. Při použití CURRENT_TIMESTAMP funkce na sloupci s výchozí přesností, PostgreSQL generuje časové razítko s vyšší dostupnou přesností, čímž generuje časové razítko se zlomkovou druhou částí - viz tyto housle SQL .

    To povede k tomu, že Carbon selže při analýze časového razítka, protože nebude očekávat uložení mikrosekund. Abyste se vyhnuli tomuto neočekávanému chování, které by narušilo vaši aplikaci, musíte výslovně zadat nulovou přesnost CURRENT_TIMESTAMP funkce, jak je uvedeno níže:

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

    Od Laravelu 5.0 timestamp() sloupců byl změněn tak, aby používal výchozí přesnost nula, což tomu zabrání.

Děkujeme @andrewhl za upozornění na problém Laravel 4.x v komentářích.

Děkujeme @ChanakaKarunarathne pro uvedení nového useCurrentOnUpdate() zástupce v komentářích.



  1. Jak vložit C# List do databáze pomocí Dapper.NET

  2. Spotlight Tuning Pack Basic:Nejlepší bezplatný nástroj pro optimalizaci SQL

  3. Jak používat model strojového učení KNN s 2UDA – PostgreSQL a Orange (část 1)

  4. Smazat pomocí Join v MySQL