MySQLにて外部キーが貼れない。エラーは出ていない(MySQLのストレージエンジン・InnoDBとMyISAMの違い)
MySQLにて外部キーを貼ろうとした
table_aのidがtable_bのidを外部キーとして参照するように、
以下のようなSQLを流した。
alter table `table_a_name` add constraint table_a_name_ibfk_1 foreign key (table_a_id) references table_b_name(table_b_id) on delete cascade on update cascade;
特にエラーは起きなかったのに、なぜか外部キーが貼れていない。
解決方法
MySQLのストレージエンジンをMyISAMからInnoDBに変えればOK.
ALTER TABLE dbname.tablename ENGINE=InnoDB;
MySQLでMyISAMからInnoDBに変更させる – Simple IT Life
解説
ストレージエンジンがMyISAMだと外部キーが貼れず、
InnoDBだと外部キーが貼れる。
今回扱っていたテーブルはMyISAMだったので、InnoDBに変更した。
ストレージエンジンとは
ストレージエンジンとは、公式サイトで以下のように紹介されている。
ストレージエンジンは、さまざまなテーブル型に対する SQL 操作を処理する MySQL コンポーネントです。
…よくわからない。
が、要するにMySQLの機能の中で、
データの読み書きを担当している部分がストレージエンジンなのだろう。
MySQLは以下の2つのストレージエンジンを持っている。
の2つのストレージエンジンから選ぶことができる。
これらのストレージエンジンはテーブルごとに設定できる。
tableAはMyISAM、
tableBはInnoDBという感じ。
MyISAMとInnoDBの違い
MyISAMは外部キーが使えない
InnoDBは使える。
今回はMyISAMが使われていたので、外部キーが貼れなかった。
他にも、
速度の遅速
行ロックできるか出来ないか
トランザクションが効くか効かないか
の違いがある。
MyISAMとInnoDBの使い分け
基本InnoDBで問題なさそう。
トランザクションと外部キーはデータの整合性を保つには必須なので。
複雑な親子関係がなく、トランザクションのようなまとまった処理がなく、
かつ速度が要求される場合はMyISAMを選ぶ感じかな
(あまり思いつかないけど)
おまけ
alter table `table_a_name` add constraint table_a_name_ibfk_1 foreign key (table_a_id) references table_b_name(table_b_id) on delete cascade on update cascade;
外部キー名によく使われる「ibfk」は、
InnoDB Foreign key
の略らしい。
そりゃInnoDBでしか外部キー使えないわな。
名は体を表すとはこういうことか。