Mysql
 sql >> база данни >  >> RDS >> Mysql

Как мога да задам стойността по подразбиране на колона с клеймо за дата на текущото време с миграции на Laravel?

Като се има предвид, че е необработен израз, трябва да използвате DB::raw() за да зададете CURRENT_TIMESTAMP като стойност по подразбиране за колона:

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

Това работи безупречно на всеки драйвер за база данни.

От Laravel 5.1.25 (вижте PR 10962 и commit 15c487fe ) вече можете да използвате новия useCurrent() метод модификатор на колона за постигане на същата стойност по подразбиране за колона:

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

Обратно към въпроса, на MySQL можете също да използвате ON UPDATE клауза чрез DB::raw() :

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

Отново, от Laravel 8.36.0 (вижте PR 36817 ) вече можете да използвате новия useCurrentOnUpdate() метод модификатор на колона заедно с useCurrent() модификатор за постигане на същата стойност по подразбиране за колона:

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

Разбирам

  • MySQL

    Започвайки с MySQL 5.7, 0000-00-00 00:00:00 вече не се счита за валидна дата. Както е документирано в ръководство за надграждане на Laravel 5.2 , всички колони с времеви отпечатъци трябва да получат валидна стойност по подразбиране, когато вмъквате записи във вашата база данни. Можете да използвате useCurrent() модификатор на колони (от Laravel 5.1.25 и по-нови) във вашите миграции, за да зададете по подразбиране колоните с времеви отпечатъци към текущите времеви печати или можете да направите времеви печати nullable() за да разрешите нулеви стойности.

  • PostgreSQL &Laravel 4.x

    Във версиите на Laravel 4.x драйверът на PostgreSQL използваше прецизността на базата данни по подразбиране за съхраняване на стойности на времеви клеймъци. Когато използвате CURRENT_TIMESTAMP функция върху колона с точност по подразбиране, PostgreSQL генерира времеви печат с налична по-висока точност, като по този начин генерира времеви печат с частична втора част - вижте тази SQL цигулка .

    Това ще накара Carbon да не успее да анализира времевата марка, тъй като няма да очаква съхраняване на микросекунди. За да избегнете това неочаквано поведение, нарушаващо приложението ви, трябва изрично да дадете нулева точност на CURRENT_TIMESTAMP функция, както следва:

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

    От Laravel 5.0, timestamp() колони е променена, за да използва нула по подразбиране точност, което избягва това.

Благодаря на @andrewhl за посочването на проблема с Laravel 4.x в коментарите.

Благодаря на @ChanakaKarunarathne за извеждане на новия useCurrentOnUpdate() пряк път в коментарите.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как да създам защитена mysql подготвена декларация в php?

  2. ИНДИЯ, STD Code Finder Script в PHP, MYSQL, JQUERY

  3. Подобряване на производителността на MySQL с разширени настройки на InnoDB

  4. MySQL бързо премахва дубликати от голяма база данни

  5. Защо получавам Не мога да предавам параметър 2 по референтна грешка, когато използвам bindParam с постоянна стойност?