Миграции Laravel - проблемы при создании временных меток

Я пытаюсь выполнить миграции в моем экземпляре Laravel. Они являются только миграциями по умолчанию (пользователи и сбрасывает пароль), но когда он пытается сделать отметки времени, это вызывает эту ошибку:

 [Illuminate\Database\QueryException]
 SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'created_at' (SQL: create table `
 users` (`id` int unsigned not null auto_increment primary key, `name` varchar(255) not null, `email` varchar(255) n
 ot null, `password` varchar(60) not null, `remember_token` varchar(100) null, `created_at` timestamp default 0 not
 null, `updated_at` timestamp default 0 not null) default character set utf8 collate utf8_unicode_ci)

а также исключение PDOException:

SQLSTATE[42000]: Syntax error or access violation: 1067 Invalid default value for 'created_at'

Как я могу это исправить?

Спасибо.

Ответ 1

Это связано с тем, что MySQL не принимает нуль в качестве допустимой даты по умолчанию, и поэтому создание таблицы не дает проверки ограничения на создание.

Вероятно, в вашей конфигурации MySQL включен NO_ZERO_DATE. Отключение этого параметра позволит вам создать таблицу или, наоборот, удалить значение по умолчанию 0 или изменить его на CURRENT_TIMESTAMP.

Подробнее об этой точной проблеме вы можете узнать здесь: https://github.com/laravel/framework/issues/3602

Ответ 2

Я столкнулся с такой же ошибкой. Учитывая, что решения действительно работают должным образом, я хочу помочь разработчикам laravel. Просто добавьте следующую строку в config/database.php

'mysql' => array(
   'strict'    => true
),

Ответ 3

это звучит как строгий режим.

Вы можете отключить строгий режим одним из двух способов:

Откройте файл my.ini в каталоге установки MySQL и найдите текстовый sql-режим.

Поиск:

SQL-режим = "STRICT_TRANS_TABLES, NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"

и измените на

SQL-режим = "NO_AUTO_CREATE_USER, NO_ENGINE_SUBSTITUTION"

или вы можете запустить следующее в phpMyAdmin

SET @@global.sql_mode = '';

Ответ 4

Это связано с тем, что MySQL не принимает нуль в качестве допустимой даты по умолчанию, поэтому вы можете написать

$table->timestamp('created_at')->nullable();
$table->timestamp('updated_at')->nullable();

или $table->nullableTimestamps();

Вместо $table->timestamps();

Ответ 5

Это работало для меня после неудачного строгого режима:

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

Ответ 6

Я использовал следующий метод:

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

Действительно работает!

Ответ 7

Миграция старых таблиц работает так:

Schema::table(
            'table',
            function (Blueprint $table) {
                $table->dateTime('created_at')->nullable()->default(NULL)->change();
                $table->dateTime('updated_at')->nullable()->default(NULL)->change();
            }
        );

from https://github.com/laravel/framework/issues/3602

Ответ 8

Вы должны отключить строгий режим MySQL на Laravel. В MySQL был строгий режим с 5.1, но в 5.7 он стал режимом по умолчанию. В Laravel вы можете исправить это в коде: отредактируйте ваш файл конфигурации database.php и добавьте ключ strict со значением false.

для пользователей без Laravel:

если вы используете приложение не от Laravel, у вас не будет такой опции. Вот как глобально отключить строгий режим. Найдите ваш файл конфигурации MySQL my.cnf или my.ini конфигурация MySQL по умолчанию будет жить в /etc/mysql/my.cnf

откройте файл и найдите раздел [mysqld]. Мы собираемся добавить новый ключ, sql_mode На MySQL 5.7 значения по умолчанию для этого ключа из коробки:

STRICT_TRANS_TABLES,ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Строгий режим исходит из STRICT_TRANS_TABLES. Итак, давайте переписать sql_mode на:

[mysqld]
sql_mode=ONLY_FULL_GROUP_BY,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION

Вот оно! Сохраните файл и перезапустите MySQL.