web-dev-qa-db-ja.com

MySQLの外部キーの基本?

MySQLの外部キー構成を使用する方法についての良い説明はありますか?

MySQLのドキュメント自体からはまったく得られません。これまで、結合やプログラミングコードで外部キーのようなものを処理してきました。

そして質問の2番目の部分は、MySQLの組み込み外部キーを使用することで改善すべき点はありますか?

88
Macha

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 CASCADEからFOREIGN KEY定義、参照行は参照行とともに自動的に削除されます。

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

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

115
Quassnoi

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

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

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

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

31
Chad Birch

1.外部キーは、データの一貫性を確保するだけです。

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

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

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

  1. 直接親テーブルを削除することはできません。まず、親テーブルを削除するよりも、子テーブルから外部キーを削除します。
11
Gaurav Kumar

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

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

それはあなたのコードを活用する素晴らしい機能です。

6
Seb