概要
ある時、PHPを使ってMySQLのデータベースを操作していたら、INSERTを使ったデータの挿入時に、下記のようなエラーが発生しました。
SQLSTATE[HY000]: General error: 1364 Field カラム名 doesn’t have a default value
カラム名のところは、適当なカラム名を入れて考えてください。
MySQL5.6からこのようなエラーが発生したので、MySQL5.6の仕様変更の可能性が高いと思い原因を探すと、それらしいことがありました。
原因
私がやろうしていたのは、INSERT文でデータを追加するときに、NULLを許容しdefault値がないカラムの情報を書かずにINSERT文を実行するということでした。
しかし、MySQL5.6からはそのようなdefault値がないカラムの情報を追加する場合に、カラムの情報を書かない場合は自動で補完されるのではなく、エラーになります。
解決法
ここで、解決法は三つあります。
一つは、default値がない場合は必ずNULLなどを指定して、何も書かずにINSERT文を実行しないようにすることです。
二つめは、default値を設定してあげることです。これで、カラムの情報として何も書かなくて大丈夫になります。
三つ目は、そもそもこのようになっていしまったのはMySQL5.6からSQL modeが変わったことです。
なので、そのSQL modeを書き換えることによって変更してしまうという方法です。
一時的に、SQL modeを変更する場合は、データベースにログインして、下記のコマンドを実行します。
mysql> SET @@GLOBAL.sql_mode='';
これでは、データベースの再起動時に元へ戻ってしまうので、恒久的にSQL modeを書き換えたい場合は、my.cnfを変更します。
sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES<
このようになっている行を下記のように変更します。
sql_mode=''
この方法であれば、MySQLを操作するプログラムがある場合に、過去のプログラムを変更することなく、対応することができます。
まとめ
カラムにはできるだけdefault値を設定しておくべきだということがよく分かるエラーでした。
今後は、カラムにはdefault値を設定しておき、なるべくINSERT文では、すべてのカラムの値を指定しておくようにしていきたいです。