外部キー(FOREIGN KEY)とは
関連性のあるテーブルを結びつけること
「ここの(外部キーを指定した)値は
こっち(親テーブルの値)から選んで入れるて」みたいな?
参照されるのが親テーブル
参照するのが子テーブル
#使用例
テーブル名:threads(子テーブル)参照する側
id(主キー) | commented_at | comment | board_id(外部キー) |
---|---|---|---|
1 | 2020/1 | aaa | A1 |
2 | 2020/2 | iii | B2 |
3 | 2020/3 | uuu | C3 |
4 | 2020/4 | eee | D4 |
テーブル名:boards(親テーブル)参照される側
id(主キー) | created_at | title |
---|---|---|
A1 | 2020/5 | AAA |
B2 | 2020/6 | III |
C3 | 2020/7 | UUU |
D4 | 2020/8 | EEE |
外部キーに指定するカラム名は(参照先のテーブル名の単数形+id)
2つのテーブルを関連付けるため、threadsテーブルにboard_idを追加。
外部キーを指定することで、もうboard_idにはboardsテーブルのカラムidしか持てなくなる
#外部キー制約
「子テーブルにデータを追加するとき親テーブルに存在しない値を含むデータの追加をエラー」
「親テーブルの削除、更新時に子テーブルにその値があるとエラー」(デフォルト)
親テーブルの削除、更新の時にエラーにしたくないのなら、設定を変更可能↓
削除更新時の動作 | |
---|---|
RESTRICT | エラー(デフォルト) |
CASCADE | 子テーブルの同じ値を削除、更新 |
SET NULL | 子テーブルの同じ値がNULLになる |
CONSTRAINT `制約名`
FOREIGN KEY (`子カラム名`)
REFERENCES `親テーブル名` (`親カラム名`)
ON DELETE 削除時の動作設定 ON UPDATE 更新時の動作設定
ALTER TABLE 子テーブル名 ADD FOREIGN KEY(子カラム名) REFERENCES 子テーブル名(子カラム名);
SHOW CREATE TABLE 子テーブル名;
ALTER TABLE 子テーブル名 DROP FOREIGN KEY 外部キー制約名;
||意味|
|--:|--:|--:|
|FOREIGN KEY|外部キー制約|
|REFERENCES|どれを参照するか|
|ON DELETE|親テーブルを削除した時|
|ON UPDATE|親テーブルを更新した時|
#どんなことができるか
たとえば、
twitterで呟いたら、コメントできるけど、
呟いたこと時自体を消せばコメントも全部消えるみたいなこと?