MySQL、insert時の値チェックを厳密にする

insert時にwarningが出る=ほとんどの場合において何かおかしいデータが入ってしまったということなので非常に残念です。その警告はエラーとして扱うべきじゃないのかと。

$ mysql -uroot database -e "
	create temporary table X (id integer);
	insert into X values(10000000000000000000000000000000000000000000000);
	select * from X"
+------------+
| id         |
+------------+
| 2147483647 | <-- wtf
+------------+

sql_modeをSTRICT_ALL_TABLESとかにすることで挿入時に一部の警告をエラーとして扱うことができる。

$ mysql -uroot database -e "
	set session sql_mode='STRICT_ALL_TABLES';
	create temporary table X (id integer);
	insert into X values(10000000000000000000000000000000000000000000000);
	select * from X"
ERROR 1264 (22003) at line 1: Out of range value adjusted for column 'id' at row 1

このオプション絶対有効にしたほうがいいですね……

トランザクション対応してないテーブルだと不正値挿入時に更新処理が途中で止まって残念なことになるという問題がある。

注意:INSERT/UPDATE は、エラーを認識すると即座に中断する。そのため、非トランザクション式のストレージ エンジンを使用している場合は、使用しない (推奨)。エラー前に変更したデータがロール バックしないため、更新が 「部分的に」 完了してしまうことがある。

http://dev.mysql.com/doc/refman/5.1/ja/server-sql-mode.html

リカバリがきく環境(開発環境とか)では無条件で有効にしちゃっていいような気がします。変な値が入ってるのに気づかないのも嫌だし。