Laravel Migrations - Issues while creating timestamps

喜你入骨 提交于 2020-01-31 03:19:09

问题


I am trying to run migrations on my Laravel instance. They are just the default migrations (users and password resets) but when it tries to make the timestamps it throws this error:

 [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)

as well as a PDOException:

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

How can I fix this?

Thanks.


回答1:


This is due to MySQL not accepting zero as a valid default date and thus the table creation fails a constraint check on creation.

You probably have 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.

You can find out more about this exact issue here: https://github.com/laravel/framework/issues/3602




回答2:


I have been facing the same error. Given solutions does work properly still i want to help laravel developers. Simply add a following line to config/database.php

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



回答3:


it sounds like strict mode.

You may disable strict mode in one of two ways:

Open your my.ini file within the MySQL installation directory, and look for the text sql-mode.

Find:

sql-mode="STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

and change to

sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION"

or you can run the following in phpMyAdmin

SET @@global.sql_mode='';




回答4:


This is due to MySQL not accepting zero as a valid default date so you can write

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

or $table->nullableTimestamps();

Instead of $table->timestamps();




回答5:


This worked for me after being unsuccessful with strict mode:

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



回答6:


You can use nullableTimestamps() instead of timestamps()

or else

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

also, check the database server version

Please have a look on these ref links:

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




回答7:


I have used the following method:

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

Really worked!




回答8:


Migrating old tables works like that:

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




回答9:


you should disable MySQL strict mode on Laravel. MySQL has had a strict mode since 5.1, but in 5.7 it became the default. In Laravel, you can fix this in code: edit your database.php config file, and add a key of strict with a value of false.

for non-Laravel users:

if you're using a non-Laravel application,you won't have that option.Here's how to disable strict mode globally.find your MySQL configuration file my.cnf or my.ini the default MySQL configuration will live in /etc/mysql/my.cnf

open the file and find the [mysqld] section.We're going to add a new key, sql_mode On MySQL 5.7, the default values for this key out of the box are:

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

The strict mode comes from STRICT_TRANS_TABLES. So, let's overwrite the sql_mode to:

[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

That's it! Save the file, and restart MySQL.




回答10:


MySQL 5.7.28

The MySQL docs recommend the following (note the use of GLOBAL):

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


来源:https://stackoverflow.com/questions/30555844/laravel-migrations-issues-while-creating-timestamps

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!