web-dev-qa-db-ja.com

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'

どうすればこれを修正できますか?

ありがとう。

13
cheese5505

これは、MySQLが有効なデフォルトの日付としてゼロを受け入れないため、テーブルの作成が作成時の制約チェックに失敗するためです。

あなたはおそらく持っています NO_ZERO_DATE MySQL構成で有効になっています。これをオフに設定すると、テーブルを作成したり、デフォルトの0値を削除したり、 CURRENT_TIMESTAMP

この正確な問題の詳細については、こちらをご覧ください: https://github.com/laravel/framework/issues/3602

10
Tom

私は同じエラーに直面しています。与えられたソリューションは正しく機能しますが、それでも私は助けたいですlaravel開発者。config/ database.phpに次の行を追加するだけです。

'mysql' => array(
   'strict'    => true
),
21
Mohan Singh

厳密モードのように聞こえます。

厳密モードは、次の2つの方法のいずれかで無効にできます。

MySQLインストールディレクトリ内のmy.iniファイルを開き、テキストsql-modeを探します。

検索:

sql-mode = "STRICT_TRANS_TABLES、NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION"

に変更します

sql-mode = "NO_AUTO_CREATE_USER、NO_ENGINE_SUBSTITUTION"

または、phpMyAdminで以下を実行できます

SET @@ global.sql_mode = '';

4
Imtiaz Pabel

これは、MySQLが有効なデフォルトの日付としてゼロを受け入れないため、次のように記述できるためです。

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

または$table->nullableTimestamps();

$table->timestamps();の代わりに

4

タイムスタンプ()の代わりにnullableTimestamps()を使用できます

またはそうでなければ

$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

2
Priyanka Patel

これは、strictモードで失敗した後、私にとってはうまくいきました。

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

私は次の方法を使用しました:

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

本当に働いた!

1
Anil Singh

古いテーブルの移行は次のように機能します。

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

0
Harry Bosh

MySQL 5.7.28

MySQLドキュメント 次のことをお勧めします(GLOBALの使用に注意してください):

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

laravelでMySQLstrictモードを無効にする必要があります。 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を追加します。MySQL5.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