web-dev-qa-db-ja.com

WHEREを使用できるのに、なぜ外部キーを使用する必要があるのですか?

MySQLの外部キーに関する初心者の質問。

w3school では、

あるテーブルのFOREIGN KEYが別のテーブルのPRIMARY KEYを指しています。

そしてまたそこに、

WHERE id = page_id

では、テーブルをリンクするためにWHEREを使用できる場合、外部キーを持つ主な目的は何ですか?

36
shin

クエリには厳密には必要ありませんが、それは本当です。これにはいくつかの理由があります。

  1. テーブルへの制約として、何も指し示さないものを挿入するのを止めます。
  2. オプティマイザの手がかりとして。そして
  3. 歴史的な理由により、どこがより必要でした。

(1)はおそらく3つのうちの重要なものです。これは 参照整合性 と呼ばれます。これは、外部キーに値がある場合、その値を親テーブルの主キーとして持つ対応するレコードがあることを意味します。

そうは言っても、すべてのデータベースが参照整合性(MySQL/MyISAMテーブルなど)をサポートしているわけではなく、必ずしもそれを強制するわけではない(パフォーマンス上の理由から)。

40
cletus

外部は参照整合性のために使用されます。

MySQLの外部キーと参照整合性の概要を参照してください

7
Adriaan Stander

では、テーブルをリンクするためにWHEREを使用できる場合、外部キーを持つ主な目的は何ですか?

WHERE句は、外部キーの等価結合に限定されないためです。

たとえば、価格範囲と割引を説明するテーブルがある場合、次の複雑な条件を使用してテーブルを結合します。

SELECT  *
FROM    Goods
JOIN    PriceRange
ON      PriceRange.Price =
        (
        SELECT  MAX(Price)
        FROM    PriceRange
        WHERE   PriceRange.Price <= Goods.Price
        )

これらのテーブルを外部キー関係にリンクすることはできませんが、簡単に結合できます。

詳細については、私のブログのこのエントリを参照してください。

ただし、pk-to-pkバインディングは依然として重要です。 FOREIGN KEYは、リンクしているエンティティがリレーショナルモデルによって記述されていることを保証します。

FOREIGN KEY- backed設計では、PRIMARY KEYが存在しないエンティティとの関係を、そのエンティティを説明するテーブルに宣言できません。

SQL Serverは、この事実を考慮に入れて、特定のタイプのクエリを最適化することもできます。

たとえば、次のクエリ:

SELECT  f.*
FROM    t_foreign f
WHERE   f.pid IN
        (
        SELECT  id
        FROM    t_primary p
        )

t_primaryFOREIGN KEYの間にt_foreign関係が定義されている場合は、t_primaryも調べられません。

詳細については、この記事を参照してください。

5
Quassnoi

参照整合性 の維持とインデックス付け。

2
Garry Shutler

データベースに主要な関係を追加するもう1つの理由があります。この情報を使用してデータベースからオブジェクトモデルを生成するさまざまなコードジェネレータがあります。一般的に使用される注目すべきパターンの1つは、ActiveRecordパターンです。キーの関係がない場合、ActiveRecordパターンはデータベースエンティティの関係を認識しないため、あまり有用でないオブジェクトモデルが生成されます。

コード生成は、すべてのソフトウェアプロジェクトに適しているわけではありません。しかし、それは多くのプロジェクトで役立ちます。コード生成を使用していない場合は、少なくとも調査する必要があります。

1
Mark Ewer

WHERE句の主な目的は、クエリによって返される行を制限することです。 SELECT構文 を参照してください。

主キー/外部キーの関係は参照整合性を維持し、適切なインデックス付けによりクエリのパフォーマンスを向上させます。 (上記のピート・オアンロンの説明と JOIN Types を参照)

1
Jim H.

rESTRICT演算子(WHERE)は参照制約とは関係ありません。

c. J. Dateの引用 リレーショナルデータベースディクショナリ

外部キーR1R2を相対変数にする、必ずしも区別する必要はありません。[〜#〜] k [〜#〜]R1のキーにします。 [〜#〜] fk [〜#〜]R2の見出しのサブセットにして、 [〜#〜] k [〜#〜]K '(たとえば)にマップする属性の名前変更の空のシーケンスK '[〜#〜] fk [〜#〜]にはまったく同じ属性が含まれます。次に[〜#〜] fk [〜#〜]は外部キーです

参照整合性大まかに言って、対応する参照タプルが存在しない場合、参照タプルが存在しないというルールは許可されます。より正確には、[〜#〜] fk [〜#〜]をいくつかの参照するrelvarR2;の外部キーにする[〜#〜] k [〜#〜]を対応する参照されるrelvarR1の対応するキーにして、K '[〜#〜] k [〜#〜]から導出されます(外部キー。次に、参照整合性ルールは、[〜#〜] fk [〜#〜]値がR2に存在する時刻が存在しないことを要求しますこれは、K '値ではない(必ずしも一意である)タプルのR1の時点質問。 R1R2はそれぞれ参照されるrelvarと参照するrelvarであり、それらの間の制約は参照制約です。

:relvar SPでは、{S#}および{P#}は、relvars Sのキー{S#}および{P#}に対応する外部キーですとP、それぞれ。特定の外部キーに対応する、参照されるrelvarのキーは、主キーである必要はありません。

1
just somebody

FOREIGN KEY制約は、テーブル間のリンクを破壊するアクションを防ぐために使用されます。

また、FOREIGN KEY制約は、無効なデータが外部キー列に挿入されるのを防ぎます。これは、それが指すテーブルに含まれている値の1つでなければならないためです。

0
shanthan

外部キーは参照整合性を維持するために使用され、WHERE句は選択などのSQL操作でテーブルを結合するために使用されます。 where句は複数のテーブルで機能しますが、これは純粋にフィルターとして存在します。

厳密に言えば、参照整合性がなくても回避できますが、それは良い考えではありません。参照整合性がないと、クライアントアプリケーションは、関係チェーンの一方の端で何かを誤って削除したり更新したりせず、データにノックオン効果を及ぼすことになります。キー値を変更して、存在しない値を指すようにします。

参照整合性は、関連データが一貫した方法で保持されることを保証する優れた方法です。

0
Pete OHanlon