HomebrewでインストールしたMariaDBをStrictモードに設定
inabaです。
MariaDBをHomebrewでインストールして使っていたのですが、
NOT NULL制約のカラムにDEFAULT NULLが設定されていると、INSERT時に値を設定していないカラムにNULLが入ってしまうという事がありました。
これはStrictモードが設定されていると起きないそうなので、Strictモードの設定をします。
デフォルトのsql_mode
Strictモードはmysqlにログイン後、sql_modeの値で設定されているか確認できます。
MariaDB [(none)]> SELECT @@SQL_MODE, @@GLOBAL.SQL_MODE; +--------------------------------------------+--------------------------------------------+ | @@SQL_MODE | @@GLOBAL.SQL_MODE | +--------------------------------------------+--------------------------------------------+ | NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +--------------------------------------------+--------------------------------------------+ 1 row in set (0.00 sec)
デフォルトではNO_AUTO_CREATE_USER
とNO_ENGINE_SUBSTITUTION
が設定されており、
Strictモードの設定値であるSTRICT_ALL_TABLES
またはSTRICT_TRANS_TABLES
が設定されていません。
my.cnfのパス
my.cnfのパスを調べます。
上記には/etc/my.cnf
が一番上に書いてありますが、/etc/my.cnf
に設定ファイルを置いてみても反映されませんでした。
上記の方法を試します。
$ mysql --help | grep my.cnf /usr/local/etc/my.cnf ~/.my.cnf order of preference, my.cnf, $MYSQL_TCP_PORT, $ cat /usr/local/etc/my.cnf # # This group is read both both by the client and the server # use it for options that affect everything # [client-server] # # include all files from the config directory # !includedir /usr/local/etc/my.cnf.d
/usr/local/etc/my.cnf
に設定ファイルmy.cnf
がありました。
設定
先程の設定に!includedir /usr/local/etc/my.cnf.d
とあるので、/usr/local/etc/my.cnf
を直接編集するのではなく、/usr/local/etc/my.cnf.d
に設定ファイルを新しく作るようにします。
設定値にはデフォルトで設定されていたNO_AUTO_CREATE_USER
とNO_ENGINE_SUBSTITUTION
も含めておきます。
含めないとデフォルトで設定されていた上記2つは消えてしまいます。
Strictモードの設定値はSTRICT_ALL_TABLES
とSTRICT_TRANS_TABLES
があります。
違いについてはDifference between strict_all_tables and strict_trans_tablesがわかりやすいです。
自分は間違った値が入ってほしくなかったのでSTRICT_ALL_TABLES
を使用するようにしました。
InnoDBだと違いは無いようなのでInnoDBの場合はどちらを選んでも良いでしょう。
$ emacs /usr/local/etc/my.cnf.d/my.cnf $ cat /usr/local/etc/my.cnf.d/my.cnf [mysqld] sql_mode = NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION,STRICT_ALL_TABLES # MariaDBの再起動 $ mysql.server restart Shutting down MySQL .. SUCCESS! Starting MySQL .170105 01:51:36 mysqld_safe Logging to '/usr/local/var/mysql/i.local.err'. SUCCESS!
設定値を確認してみます。
MariaDB [(none)]> SELECT @@SQL_MODE, @@GLOBAL.SQL_MODE; +--------------------------------------------------------------+--------------------------------------------------------------+ | @@SQL_MODE | @@GLOBAL.SQL_MODE | +--------------------------------------------------------------+--------------------------------------------------------------+ | STRICT_ALL_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | STRICT_ALL_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION | +--------------------------------------------------------------+--------------------------------------------------------------+ 1 row in set (0.00 sec)
STRICT_ALL_TABLES
が設定されている事が確認できました。
これでNOT NULL制約が厳密に適用されます。
今日はここまで。