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();
}
);
你应该在 Laravel 上禁用 MySQL 严格模式。
MySQL 自 5.1 以来就有严格模式,但在 5.7 中它成为默认模式。
在 Laravel 中,您可以在代码中解决此问题:编辑您的 database.php
配置文件,并添加值为 false
.
的键 strict
非Laravel用户:
如果您使用的是非 Laravel 应用程序,您将不会知道 option.Here 如何禁用严格模式 globally.find 您的 MySQL 配置文件 my.cnf
或 my.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'));
另外,检查数据库服务器版本
请查看这些参考链接:
MySQL 5.7.28
The MySQL docs推荐如下(注意GLOBAL
的使用):
SET GLOBAL sql_mode = 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
我正在尝试 运行 在我的 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();
}
);
你应该在 Laravel 上禁用 MySQL 严格模式。
MySQL 自 5.1 以来就有严格模式,但在 5.7 中它成为默认模式。
在 Laravel 中,您可以在代码中解决此问题:编辑您的 database.php
配置文件,并添加值为 false
.
strict
非Laravel用户:
如果您使用的是非 Laravel 应用程序,您将不会知道 option.Here 如何禁用严格模式 globally.find 您的 MySQL 配置文件 my.cnf
或 my.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'));
另外,检查数据库服务器版本
请查看这些参考链接:
MySQL 5.7.28
The MySQL docs推荐如下(注意GLOBAL
的使用):
SET GLOBAL sql_mode = 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';