Миграции 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.