はじめに
コジマです。
データベースを触ってると「外部キー」というものを目にする人は多いと思います。
ただ、データベースのことをよく知らないまま「外部キー」を目にしても
なんのこっちゃ。。。ってなってしまう人も多いのではないかと思います。
むしろ思うようにデータの更新ができなかったりして邪魔に思う人もいるのではないでしょうか?
- 外部キーっていったい何なの?
- 外部キーがあると何がうれしいの?
- 外部キーはどういう風に定義するの?
の3つに分けて説明していこうと思います。
外部キーっていったい何なの?
外部キーとは「別テーブルに持つキー」のことを言います。
英語ではFOREIGN KEYと呼ばれます。
気持ち的には「お前がいなきゃダメなんだ」ということです。(地味に大事)
もうちょっとだけ詳しく書くと、
子テーブルに参照される親テーブルのキーのことを指します。
外部キーがあると何がうれしいの?
外部キーをつけることで、テーブル間に親子関係をつけることができます。
親子関係をつけることで、データの不整合を防ぐことができます。
このようなテーブルがあったとします。
伝票テーブルには、購入した店舗や発注日など
伝票明細テーブルには購入した商品など
が登録してあります。
このとき、伝票がないと伝票明細ができるわけないですよね?
つまりは伝票明細から見て伝票のデータは必要な情報なのです。
伝票明細にとって「伝票、お前がいなきゃダメなんだ」となるのです。
こういう場合に、伝票明細テーブルの伝票番号に伝票テーブルの伝票番号を外部キーとして定義することで、
伝票テーブルが親、伝票明細テーブルが子という親子関係を確立することができます。
仮に、上のキャプチャの状態で伝票明細テーブルに伝票番号=6のデータを入れようとすると
「伝票テーブルに伝票番号=6のデータないからダメだよ」ってエラーを出してくれます。
このように、外部キーを設定することで伝票テーブルと伝票明細テーブルの間でデータの不整合が起こらないようになります。
外部キーはどういう風に定義するの?
最後に、外部キーを設定するためにどのようなSQLを書けばいいのかという話をします。
ここでは正確なSQLは書きません。イメージが掴めるようになるレベルでの説明をします。
使うDBによって微妙に書き方が変わったりするからです。
テンプレ
ALTER TABLE [子テーブル] -- 子テーブルの定義を変更するよ ADD FOREIGN KEY ([子テーブルの列名]) -- [子テーブルの列名]に外部キーを設定するよ REFERENCES [親テーブル]([親テーブルの列名]) -- [親テーブル]の[親テーブルの列名]が外部キーになるよ
こんな感じ。
先ほどの伝票テーブルと伝票明細テーブルの例で外部キーを定義するには以下のように書きます。
今回の例
ALTER TABLE 伝票明細テーブル -- 子テーブルの定義を変更するよ ADD FOREIGN KEY (伝票番号) -- [子テーブルの列名]に外部キーを設定するよ REFERENCES 伝票テーブル(伝票番号) -- [親テーブル]の[親テーブルの列名]が外部キーになるよ
という感じです。
こうすることで伝票明細テーブルの伝票番号は伝票テーブルに登録された伝票番号しか受け付けなくなります。
さいごに
まとめます。
- テーブル間に親子関係を作れる
- 子テーブルに参照される親テーブルのキーのことだよ
- 親子関係があるとデータの不整合を防げるよ
- 子から見たら「お前がいなきゃダメなんだ」という気持ち
外部キーのイメージを掴めるようになってくれたらうれしい。
まともにドキュメントを読むと難しいと思うので。
自分なりに嚙み砕いたつもりです
この記事を面白いまたは役に立ったと思ってくれた方は是非私のTwitter(@kojimanotech)を
フォローしてくれたらうれしいです!
もっと学びたい人はこちら
SQLをもっと学びたいエンジニアのためにおすすめのUdemy講座を紹介いたします!
SQLはじめましての人!まずあなたの3時間をください。
この講座でまずこれだけは覚えてくれ!という内容をしっかり押さえることができます。
SQLはプログラミング言語がなんであれ、システム開発に必要になります。
この講座を見て最低限必要な知識を身に着けて実践で貢献できるようになりましょう!
3時間で学ぶ SQL ・データベース 超入門【丁寧な解説+演習問題で SQL データ抽出の基本が身につく】標準 SQL
データベースの設計について学べる講座です。
設計について学べる教材は少ないので、実務でデータベースを触る人にはとてもうれしい講座です。
データベース講座1:データベース論理設計
ちょっとニッチに感じるかもしれませんが、SQLのインデックスを学ぶことができる講座です。
よい性能でSQLを運用するためにはインデックスの理解は必要不可欠です。
CRUD書いて満足するエンジニアを出し抜きましょう。
SQLServerのインデックスを理解して検索を速くする方法
気になった人はぜひ見てみてくださいね!
以上、コジマでした。