外部キー(foreign key)
外部キーとは
外部キー(英:foreign key、略:FK)とは、関係データベースにおいてデータの整合性を保つための制約(参照整合性制約)のことです。
外部キーに設定しているカラムには、参照先となるテーブルのカラム内に存在している値しか設定できません。
例えば、次のようなテーブルがあるとします。
「社員テーブル」(左側)の「部署ID」は、「部署テーブル」(右側)の主キーである「部署ID」に対して外部キーを設定しています。
そのため、「社員テーブル」(左側)の「部署ID」には、「部署テーブル」(右側)の「部署ID」に存在している値しか設定できません。
スポンサーリンク
参照先にないデータを登録するとどうなるの?
外部キーに設定されている列(カラム)には、参照先となるテーブルの列内(カラム内)に存在している値しか設定できません。
では、参照先にないデータを登録したらどのような動きになるのでしょうか。
例えば、次のようなテーブルがあるとします。このテーブルに対して外部キーが参照している「部署テーブル」(右側)に存在しない「部署ID = 4」という行(レコード)を「社員テーブル」(左側)に追加(INSERT文)すると、制約エラーとなり登録することはできません。
参照元がある行(レコード)を削除するとどうなるの?
外部キーは次の5種類の参照操作を規定しています。参照元がある行(レコード)を更新や削除するとどうなるかは、この参照操作の設定により異なります。
更新(UPDATE) | 削除(DELETE) | |
CASCADE | 参照先の変更に追従する | 参照先が無くなると同時に削除される |
RESTRICT | 制約エラーになる | 制約エラーになる |
NO ACTION | RESTRICTと同じ | RESTRICTと同じ |
SET NULL | 参照先が変わるとNULLに更新される | 参照先が削除されるとNULLに更新される |
SET DEFAULT | 参照先が変わるとデフォルト値に更新される | 参照先が削除されるとデフォルト値に更新される |
以下は「RESTRICT」の場合の例です。
例えば次のようなテーブルがあるとします。「部署テーブル」(右側)の「部署ID = 2」の行(レコード)を削除(DELETE文)してみます。
削除した結果、「部署テーブル」(右側)の「部署ID = 2」の行(レコード)は、参照元があるので制約エラーとなり削除することはできません。
「部署テーブル」(右側)の「部署ID = 2」の行(レコード)を削除するためには、参照元である「社員テーブル」(左側)の対象の行(レコード)を削除し、参照元がなくなった状態にする必要があります。参照元がなければ削除できます。