MySQLをバージョンアップしたところの不具合
5.7になり INSERT をした際に値がないカラムを挿入しようとするとエラーが帰ってきて挿入できない問題点が発生しました。
Error Code: 1364. Field 'modfied' doesn't have a default value
このようなエラーがでます。
sql_modeの確認
sql_modeを確認したところこのような状態になっていました。
mysql -u root -p -e "SHOW VARIABLES LIKE '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
特に設定はしてないので初期状態がこのようになっています。
sql_modeの定数について
ONLY_FULL_GROUP_BY
GROUP BY 句で名前が指定されていない非集約カラムを、選択リスト、HAVING 条件、または (MySQL 5.6.5 以降で) ORDER リストが参照するクエリーを拒否します。
ONLY_FULL_GROUP_BY が有効な場合、次のクエリーは無効です。1 番目は、選択リスト内の非集約の address カラムが GROUP BY 句で名前を指定されておらず、2 番目は、HAVING 句の max_age が GROUP BY 句で名前を指定されていないため、ともに無効になります。
https://dev.mysql.com/doc/refman/5.6/ja/sql-mode.html
STRICT_TRANS_TABLES
値を指定したとおりにトランザクションテーブルに挿入できない場合、ステートメントを中止します。非トランザクションテーブルの場合、値が単一行ステートメントで発生するか、複数行ステートメントの先頭行で発生した場合、ステートメントを中止します。
https://dev.mysql.com/doc/refman/5.6/ja/sql-mode.html
NO_ZERO_DATE
0 や '0000-00-00' を無効な日時として扱います
http://ngyuki.hatenablog.com/entry/2013/04/29/195140
NO_ZERO_IN_DATE
'2000-00-00' のような月や日に 0 がある日時を無効な日時として扱います
http://ngyuki.hatenablog.com/entry/2013/04/29/195140
ERROR_FOR_DIVISION_BY_ZERO
MySQL標準の状態ではゼロでの除算はエラーにならず NULL となる(warningも出ない)。これをエラーにするには SQL_MODE に ERROR_FOR_DIVISION_BY_ZERO を指定する。
http://sakaik.hateblo.jp/entry/20100303/mysqlmode
NO_AUTO_CREATE_USER
パスワード無しではユーザを作成出来なくする。
http://www.hirohama.biz/mysql/2007/06/22-100644.html
NO_ENGINE_SUBSTITUTION
CREATE TABLE または ALTER TABLE などのステートメントが無効またはコンパイルされていないストレージエンジンを指定したとき、デフォルトのストレージエンジンの自動置換を制御します。
ストレージエンジンは実行時にプラガブルであるため、利用できないエンジンも同様に扱われます。
NO_ENGINE_SUBSTITUTION を無効にすると、CREATE TABLE については、目的のエンジンが利用できない場合にデフォルトエンジンが使用されて警告が発生します。ALTER TABLE では、警告が発生してテーブルは変更されません。
NO_ENGINE_SUBSTITUTION を有効にすると、目的のエンジンが利用できない場合にエラーが発生し、テーブルは作成または変更されません。
https://dev.mysql.com/doc/refman/5.6/ja/sql-mode.html
はずしたいsql_mode
STRICT_TRANS_TABLES をはずしたいのですが 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
MySQLを再起動して再度確認すると
mysql -u root -p -e "SHOW VARIABLES LIKE '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
ためしに INSERT してみたところ無事行の追加が出来ました。