【エラーの原因と解消方法】 PDOException (HY000) : SQLSTATE[HY000]: General error: 1364 Field ‘カラム名’ doesn’t have a default value

MySQL

PDOException (HY000) : SQLSTATE[HY000]: General error: 1364 Field ‘カラム名’ doesn’t have a default value

MySQLでこんなエラーで困っていませんか?

PDOException (HY000) : SQLSTATE[HY000]: General error: 1364 Field 'カラム名' doesn't have a default value 

多くの場合はこんな時に出たのではないでしょうか?

  • DB自体の設定変更した後
  • MySQL5.5以前のバージョンから新しいMySQL(5.6/5.7/8.0)に移行した
  • Insert時にエラーが出ている

このページではこのようなエラーが出た方へ原因や解消方法を説明していきます。

エラーの原因

このエラーが出る原因はsql_modeの設定が型の厳密チェックがONになっていることにあります。

sql_modeの設定がSTRICT_TRANS_TABLESやSTRICT_ALL_TABLESになっているとこのようなエラーが出ます。

特にSTRICT_TRANS_TABLESはMySQL5.6~からデフォルトで有効になっており非常に出会う機会が多いと思います。

エラーの対処法

解決方法は3つ。

  • ①DBの設計としてデフォルト値をすべて設定しなおす
  • ②プログラムのクエリ発行箇所を全て修正
  • ③DB設定ファイルを修正

①②は理想かもしれませんが、プログラムコードの全修正とテストを全てやり直すなど、現実的ではない場合も多くあるでしょう。

③なら一瞬ですので、今回は③でいきます。

今のsql_modeを確認してみましょう。

$ mysql -uroot -p

sql_modeの設定を確認

mysql> show variables like '%sql_mode%';
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| Variable_name | Value                                                                                                                                     |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
| sql_mode      | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
+---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

こちらの値をコピーして、my.cnf上でSTRICT_ALL_TABLESやSTRICT_TRANS_TABLESを削除して設定します。

vi /etc/my.cnf
[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

~略~

参考ページ

コメント

タイトルとURLをコピーしました