MySQLの外部キーの基本?


91

MySQLの外部キーコンストラクトの使用方法についての良い説明はありますか?

MySQLドキュメント自体からはあまりわかりません。これまで、結合やプログラミングコードを使用して外部キーなどを処理してきました。

また、質問の後半では、MySQLの組み込みの外部キーを使用して改善すべき点はありますか?

回答:


117

FOREIGN KEYS データの整合性を確保してください。

効率の点でクエリを改善するのではなく、いくつかの間違ったクエリを失敗させるだけです。

このような関係がある場合:

CREATE TABLE department (id INT NOT NULL)
CREATE TABLE employee (id INT NOT NULL, dept_id INT NOT NULL, FOREIGN KEY (dept_id) REFERENCES department(id))

departmentいくつかemployeeのがある場合は削除できません。

ユーザーが指定した場合ON DELETE CASCADEFOREIGN KEY定義、参照行が参照されたものと一緒に自動的に削除されます。

制約として、FOREIGN KEY実際にはクエリが少し遅くなります。

参照されるテーブルから削除するとき、または参照するテーブルに挿入するときに、追加のチェックを実行する必要があります。


1
通常、インデックス付きフィールドでFKを作成するため、速度低下は最小限に抑えられ、関連する値を簡単に見つけることができます。
セブ

4
それが私が "少し"と書いた理由です:)実際、たくさんの行を削除するJOIN場合、基礎となるのは、フルテーブルスキャンを使用する2つのDELETEよりもはるかに効率が悪い可能性があります
Quassnoi

2
反対票を投じてすみません。偶然でしたが、投票を変更することはできません。
ワンダークリケット2015年

8
@Wondercricket:私は今何をすべきかさえ知りません、それはサイトルールの灰色の領域です。私はあなたがモスクワにいて、私たちも同じであるときにビールを買ってくれると思います。
Quassnoi 2015年

1
@stack:参照されたキーに対して行った更新は、参照テーブルにカスケードされます。
Quassnoi

32

実際の外部キーを使用する主な利点は、データの整合性を確保し、何かが変更または削除されたときに関連アイテムにカスケードアクションを設定できることです。

たとえば、フォーラムをプログラミングしているとしましょう。主キーの「トピック」テーブルがあり、トピックテーブルへの外部キーtopics.topic_idである列posts.topic_idでトピックに投稿が添付されている「投稿」テーブルがあります。

この外部キーの関係により、すべての投稿が有効なトピックに確実に添付されます。あなたが持っている唯一のトピックがID#1である場合、トピック#2に接続されたデータベースに投稿が存在することは不可能です。データベースはこれを保証します。

カスケードの利点として、トピックがトピックテーブルから削除された場合に、データベースがこのトピックに添付された投稿テーブル内のすべての投稿を自動的に削除するように設定できます。これは、手動で実行する必要がある手順を削除するので便利です。多くのテーブルがリンクされていると、非常に複雑になる可能性があります。外部キーを使用すると、すべての関係を自動的にクリーンアップできます。


11

1.FOREIGN KEYSは、データの一貫性を保証します。

2.削除カスケードを外部キー定義に適用すると、親行が削除されるときに参照行が自動的に削除されます。

3. Update Cascadeを外部キー定義に適用すると、親行が更新されるときに子行が自動的に更新されます。

クエリ:ALTER TABLE child ADD FOREIGN KEY(parent_id)REFERENCES parent(id)ON UPDATE CASCADE ON DELETE CASCADE;

  1. 直接の親テーブルを削除することはできません。子テーブルから外部キーを削除してから、親テーブルを削除してください。

7
最後に、外部キーの例について混乱していることがわかりました。4歳の父親として、私は子供が親を追跡することに慣れていません。さらに40年ほど経つと、これはもはや逆に見えなくなるかもしれません。
ボブスタイン

1
「子」や「親」のような例のテーブル名を付けてくれてありがとう...それは実際にはかなり役立つので、公式ドキュメントがそれを望んでいます!
マイクげっ歯類

7

主な利点は、テーブルに入力できる値を制限できることです。参照されるテーブルに存在しない値を入力しようとすると、入力できません。

また、参照テーブルの値を更新または削除する場合、値を自動的に更新するか、その値を含む行をカスケードで削除するように設定できます。

これは、実際にコードを活用する優れた機能です。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.