これまでsqlite3で外部キーを使ったことがなかったので知りませんでしたが、sqlite3はデフォルトでは外部キーのサポートが無効になっている事に気が付きました(バージョンは3.6.22)。テーブルのcreate時に外部キー制約を指定することはできるけれど、実際に参照先テーブルのレコードが変更、削除されたときはノーチェックです。不正なデータだろうがなんだろうがwarningひとつ出しません。 sqlite3で外部キーを使いたい場合、PRAGMA文で動作を変更しなければいけません。sqlite3はPRAGMA文で動作を変更できるらしいです。たとえばPRAGMA cache_sizeでキャッシュサイズを変更できます。PRAGMA文で使える項目のリストは以下のページに記載されています。 http://www.sqlite.org/pragma.html PRAGMAで外部キー制約を有効にしたい
![sqlite3のPRAGMA文で外部キー制約を有効にする - yattのブログ](https://cdn-ak-scissors.b.st-hatena.com/image/square/832225a07e2caf939ee6a7dd080731ac539e96ff/height=288;version=1;width=512/https%3A%2F%2Fimages-fe.ssl-images-amazon.com%2Fimages%2FI%2F51r-Gv%252Bqg1L._SL160_.jpg)