Laravel Migrations - Issues while creating timesta

2020-05-26 10:00发布

问题:

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';