君は心理学者なのか?

大学時代に心理学を専攻しなぜかプログラマになった、サイコ(心理学)プログラマかろてんの雑記。

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に変更した。

simple-it-life.com

ストレージエンジンとは

ストレージエンジンとは、公式サイトで以下のように紹介されている。

ストレージエンジンは、さまざまなテーブル型に対する SQL 操作を処理する
MySQL コンポーネントです。

…よくわからない。

が、要するにMySQLの機能の中で、

データの読み書きを担当している部分がストレージエンジンなのだろう。

MySQLは以下の2つのストレージエンジンを持っている。

の2つのストレージエンジンから選ぶことができる。

shindolog.hatenablog.com

これらのストレージエンジンはテーブルごとに設定できる。

tableAはMyISAM

tableBはInnoDBという感じ。

MyISAMInnoDBの違い

MyISAMは外部キーが使えない

InnoDBは使える。

今回はMyISAMが使われていたので、外部キーが貼れなかった。

他にも、

の違いがある。

MyISAMInnoDBの使い分け

基本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でしか外部キー使えないわな。

名は体を表すとはこういうことか。