環境
[Mysql ver5.7.22]
[PHP ver7.1.7]
[Laravel ver5.5.42]
1.症状
Mysqlにデータをinsertしようとした際
SQLSTATE[HY000]: General error: 1364 Field 'カラム名'
doesn't have a default value (SQL: insert into `〇〇` (`updated_at`, `created_at`)
values...(以下略)
との表示が。。
今まで見たことないし、今までとinsertの際異なることと言ったら、別管理で使うgroup_idを持たせたくらい??
+----+----------+-----------------------+---------------------+---------------------+
| id | group_id | name | created_at | updated_at |
+----+----------+-----------------------+---------------------+---------------------+
| 1 | 0 | name1 | 2018-01-05 23:59:59 | 2018-01-09 23:59:59 |
| 2 | 0 | name2 | 2018-02-07 00:00:00 | 2018-02-09 00:00:00 |
| 3 | 0 | name3 | 2018-08-21 21:26:04 | 2018-08-21 21:26:04 |
| 4 | 0 | name4 | 2018-08-21 21:26:08 | 2018-08-21 21:26:08 |
+----+----------+-----------------------+---------------------+---------------------+
2.原因・対策
原因はStrictModeでした。
このモードがtrueであるとInsertやUpdate時に不正な値が入らないよう制限をかけてくれるようです。
こちらは簡単にfalseにできて
/config/database.php
'mysql' => [
'strict' => false
]
これで完結です。
私の場合Request内にgroup_idの値が入っていなかったため、
値入ってないカラムがあるから処理できないでー😅
ということでエラーが出たようです。
古いパージョンのMySQLではデフォルト設定でないようなのでバージョンを上げたことにStrictModeが原因でうまく動作しなくなってしまうケースもあるようです。💦
私はこれで改善したのですが、一応改善しない場合のためもう一パターン載せておきます。
3.SQLモード
MySQLにおいて無効な値が入力された場合エラーをだすか、有効な値にして入力するかの設定をになっているのがSQLモード
です。
ONLY_FULL_GROUP_BYや
STRICT_TRANS_TABLESなど
デフォルトで設定が為されています。
詳しい仕様はググっていただけると😀
SQLモードに関してはMySQL内で
SET GLOBAL sql_mode="〇〇";
で設定可能であるので
ここの値をいじって改善する場合もあるそうなので是非確認していただけるとよいかもです。