Laravel 迁移 - 创建时间戳时出现问题

Laravel Migrations - Issues while creating timestamps

我正在尝试 运行 在我的 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'

我该如何解决这个问题?

谢谢。

这是由于 MySQL 不接受零作为有效的默认日期,因此 table 创建未通过创建约束检查。

你可能 NO_ZERO_DATE enabled in your MySQL configuration. Setting this to off will allow you to create the table or alternatively remove the default 0 value or change it to CURRENT_TIMESTAMP.

您可以在此处找到有关此确切问题的更多信息:https://github.com/laravel/framework/issues/3602

听起来像严格模式。

您可以通过以下两种方式之一禁用严格模式:

打开 MySQL 安装目录中的 my.ini 文件,然后查找文本 sql-mode.

查找:

sql-模式="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

并更改为

sql-模式="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

或者您可以 运行 在 phpMyAdmin

中执行以下操作

SET @@global.sql_mode='';

我一直面临同样的错误。鉴于解决方案确实有效,我仍然想帮助 laravel 开发人员。 只需将以下行添加到 config/database.php

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

这是因为 MySQL 不接受零作为有效的默认日期,因此您可以写

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

$table->nullableTimestamps();

而不是$table->timestamps();

在严格模式下失败后,这对我有用:

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

我用过以下方法:

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

真的成功了!

迁移旧表的工作方式如下:

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

来自 https://github.com/laravel/framework/issues/3602

你应该在 Laravel 上禁用 MySQL 严格模式。 MySQL 自 5.1 以来就有严格模式,但在 5.7 中它成为默认模式。 在 Laravel 中,您可以在代码中解决此问题:编辑您的 database.php 配置文件,并添加值为 false.

的键 strict

非Laravel用户:

如果您使用的是非 Laravel 应用程序,您将不会知道 option.Here 如何禁用严格模式 globally.find 您的 MySQL 配置文件 my.cnfmy.ini 默认 MySQL 配置将存在于 /etc/mysql/my.cnf

打开文件,找到[mysqld] section.We要添加一个新密钥,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.

您可以使用 nullableTimestamps() 而不是 timestamps()

否则

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

另外,检查数据库服务器版本

请查看这些参考链接:

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

https://laracasts.com/discuss/channels/forge/syntax-error-or-access-violation-1067-invalid-default-value-for-created-at

MySQL 5.7.28

The MySQL docs推荐如下(注意GLOBAL的使用):

SET GLOBAL sql_mode = 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';