MySQL – 外部キー制約

外部キーの設定

テーブル構成

学生の履修科目に関する簡単なデータベースを考える。

  • studentsテーブルは学生に関するデータを保存
    • 学生ID(主キー)
    • 学生の名前
  • student_coursesテーブルは学生の履修科目に関するデータを保存
    • 履修科目ID(主キー)
    • 学生ID
    • 科目名

学生テーブル

以下のクエリーでテーブルを作成し、学生データを登録。

登録結果の確認。

履修科目テーブル~外部キーの設定

以下のクエリーで履修科目テーブルを作成。student_idを外部キーとして、studentsテーブルのid(学生ID)を参照している。

外部キーを設定するカラムについて、以下のように定義する。

FOREIGN_KEY (参照するキー) REFERENCES 参照されるテーブル(参照されるキー)

テーブル構造を確認すると、student_idKey欄がMULとなる。このMULについてはぴったりの情報が得られなかったが、以下のようなことらしい。

  • 外部参照するキーにはインデックスが設定される
  • PRIMARY KEYINIQUEが設定されていないインデックスは同じ値を取り得る
  • なのでmultiple keyMULと表示される

外部キー制約の確認

正常な登録

新しいデータをstudent_coursesテーブルに登録する。student_idとして登録済みのstudents.id = 1の学生IDを指定する。

正常に登録されて、students_coursesテーブルは以下のようになる。

存在しないデータの登録はエラー

student_idに、studentsテーブルでは登録されていない値を指定する。

外部キー制約でエラーとなる。

参照されている親のデータは消せない

student_coursesテーブルのデータから参照されている、studentsテーブルのid=1のデータを削除しようとするとエラーになる。

参照されていない親のデータは削除できる

student_coursesのデータから参照されていない、studentsテーブルのid=2のデータは削除できる。

不整合時の挙動~RESTRICTやCASCADEなど

FOREIGN KEY指定時に、参照先のデータの削除時と変更時の挙動を指定できる。

ON DELETE 挙動指定 ON UPDATE 挙動指定

挙動指定には以下の4つがあり、指定しない場合はRESTRICTとなる。

RESTRICT
DELETE, UPDATEともエラーになる。
CASCADE
DELETEでは参照元のデータも削除され、UPDATEでは参照先の変更が参照元のデータに反映される。
SET NULL
DELETE, UPDATEともNULLに置き換わる。
NO ACTION
RESTRICTと同じ挙動。

外部キー制約をCASCADEに変更する

CREATE TABLEの確認

外部キー制約設定後のテーブル定義を以下のコマンドで確認してみる。

SHOW CREATE TABLE テーブル名\G;

  • 最初に実行したクエリーの内容に即している
  • CONSTRAINT `外部制約名`が追加されている

挙動の変更

外部キー制約の挙動をRESTRICTからCASCADEに変更する。外部キーの操作はALTER TABLEで行うが、一度に変更できないので一旦外部キーを削除し、新たな条件で外部キーを追加する。

外部キーの削除

外部キー削除のコマンドは以下の通り。

ALTER TABLE 参照元テーブル DROP FOREIGN KEY 外部制約名;

外部制約名は、先のSHOW CREATE TABLEで確認した内容で指定する。

外部キー削除後もインデックスは残っている。

外部キー削除後のCREATE TABLEを確認すると、student_idにインデックスが設定されている。

外部キーの追加

以下のクエリーで削除・更新時の挙動を指定して外部キーを追加。

クエリー実行。

CREATE TABLE確認。

CASCADEの挙動

ON UPDATE CASCADE

参照先、親テーブルstudentsのデータのid=39に変更する。RESTRICTではエラーになったが、CASCADEの場合は変更が通る。

student_coursesstudent_idも変更されている。

ON DELETE CASCADE

参照先、親テーブルのid=9のレコードを削除する。RESTRICTではエラーになったが、CASCADEの場合は削除される。

student_coursesstudent_id=9のレコードも削除されている。

外部キー制約の追加・削除

外部キーの追加は、ALTER TABLE ... ADD FOREIGIN KEYで行う。被参照キーにインデックスが設定されている必要がある。

外部キーの削除はALTER TABLE ... DROP FOREIGN KEYで行う。制約名はSHOW CREATE TABLEで確認できる。

 

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です