LoginSignup
13
16

More than 5 years have passed since last update.

MySQLをバージョンアップした際にsql_modeが変更してしまう問題点の解決

Posted at

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 の中には存在しませんでした。
初期設定のようで必要ないモードを外すように記述しました。

/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

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 してみたところ無事行の追加が出来ました。

13
16
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
13
16