MySQL5.6のNULLを許容するカラムにデータを追加するときのエラー

目次

概要

ある時、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文では、すべてのカラムの値を指定しておくようにしていきたいです。