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が有効なデフォルトの日付としてゼロを受け入れないため、テーブルの作成が作成時の制約チェックに失敗するためです。
あなたはおそらく持っています NO_ZERO_DATE
MySQL構成で有効になっています。これをオフに設定すると、テーブルを作成したり、デフォルトの0値を削除したり、 CURRENT_TIMESTAMP
。
この正確な問題の詳細については、こちらをご覧ください: https://github.com/laravel/framework/issues/3602
私は同じエラーに直面しています。与えられたソリューションは正しく機能しますが、それでも私は助けたいですlaravel開発者。config/ database.phpに次の行を追加するだけです。
'mysql' => array(
'strict' => true
),
厳密モードのように聞こえます。
厳密モードは、次の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 = '';
これは、MySQLが有効なデフォルトの日付としてゼロを受け入れないため、次のように記述できるためです。
_$table->timestamp('created_at')->nullable();
$table->timestamp('updated_at')->nullable();
_
または$table->nullableTimestamps();
$table->timestamps();
の代わりに
タイムスタンプ()の代わりにnullableTimestamps()を使用できます
またはそうでなければ
$table->timestamp('created_at')->default(\DB::raw('CURRENT_TIMESTAMP'));
また、データベースサーバーのバージョンを確認してください
これらの参照リンクをご覧ください。
これは、strictモードで失敗した後、私にとってはうまくいきました。
$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();
}
);
MySQL 5.7.28
MySQLドキュメント 次のことをお勧めします(GLOBAL
の使用に注意してください):
SET GLOBAL sql_mode = 'ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';
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。