MySQLの外部キーに関する初心者の質問。
w3school では、
あるテーブルのFOREIGN KEYが別のテーブルのPRIMARY KEYを指しています。
そしてまたそこに、
WHERE id = page_id
では、テーブルをリンクするためにWHEREを使用できる場合、外部キーを持つ主な目的は何ですか?
クエリには厳密には必要ありませんが、それは本当です。これにはいくつかの理由があります。
(1)はおそらく3つのうちの重要なものです。これは 参照整合性 と呼ばれます。これは、外部キーに値がある場合、その値を親テーブルの主キーとして持つ対応するレコードがあることを意味します。
そうは言っても、すべてのデータベースが参照整合性(MySQL/MyISAMテーブルなど)をサポートしているわけではなく、必ずしもそれを強制するわけではない(パフォーマンス上の理由から)。
外部は参照整合性のために使用されます。
では、テーブルをリンクするために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_primary
とFOREIGN KEY
の間にt_foreign
関係が定義されている場合は、t_primary
も調べられません。
詳細については、この記事を参照してください。
参照整合性 の維持とインデックス付け。
データベースに主要な関係を追加するもう1つの理由があります。この情報を使用してデータベースからオブジェクトモデルを生成するさまざまなコードジェネレータがあります。一般的に使用される注目すべきパターンの1つは、ActiveRecordパターンです。キーの関係がない場合、ActiveRecordパターンはデータベースエンティティの関係を認識しないため、あまり有用でないオブジェクトモデルが生成されます。
コード生成は、すべてのソフトウェアプロジェクトに適しているわけではありません。しかし、それは多くのプロジェクトで役立ちます。コード生成を使用していない場合は、少なくとも調査する必要があります。
WHERE句の主な目的は、クエリによって返される行を制限することです。 SELECT構文 を参照してください。
主キー/外部キーの関係は参照整合性を維持し、適切なインデックス付けによりクエリのパフォーマンスを向上させます。 (上記のピート・オアンロンの説明と JOIN Types を参照)
rESTRICT演算子(WHERE)は参照制約とは関係ありません。
c. J. Dateの引用 リレーショナルデータベースディクショナリ
外部キーR1とR2を相対変数にする、必ずしも区別する必要はありません。[〜#〜] k [〜#〜]をR1のキーにします。 [〜#〜] fk [〜#〜]をR2の見出しのサブセットにして、 [〜#〜] k [〜#〜]をK '(たとえば)にマップする属性の名前変更の空のシーケンスK 'と[〜#〜] fk [〜#〜]にはまったく同じ属性が含まれます。次に[〜#〜] fk [〜#〜]は外部キーです
参照整合性大まかに言って、対応する参照タプルが存在しない場合、参照タプルが存在しないというルールは許可されます。より正確には、[〜#〜] fk [〜#〜]をいくつかの参照するrelvarR2;の外部キーにする[〜#〜] k [〜#〜]を対応する参照されるrelvarR1の対応するキーにして、K 'は[〜#〜] k [〜#〜]から導出されます(外部キー。次に、参照整合性ルールは、[〜#〜] fk [〜#〜]値がR2に存在する時刻が存在しないことを要求しますこれは、K '値ではない(必ずしも一意である)タプルのR1の時点質問。 R1とR2はそれぞれ参照されるrelvarと参照するrelvarであり、それらの間の制約は参照制約です。
例:relvar SPでは、{S#}
および{P#}
は、relvars Sのキー{S#}
および{P#}
に対応する外部キーですとP、それぞれ。特定の外部キーに対応する、参照されるrelvarのキーは、主キーである必要はありません。
FOREIGN KEY制約は、テーブル間のリンクを破壊するアクションを防ぐために使用されます。
また、FOREIGN KEY制約は、無効なデータが外部キー列に挿入されるのを防ぎます。これは、それが指すテーブルに含まれている値の1つでなければならないためです。
外部キーは参照整合性を維持するために使用され、WHERE句は選択などのSQL操作でテーブルを結合するために使用されます。 where句は複数のテーブルで機能しますが、これは純粋にフィルターとして存在します。
厳密に言えば、参照整合性がなくても回避できますが、それは良い考えではありません。参照整合性がないと、クライアントアプリケーションは、関係チェーンの一方の端で何かを誤って削除したり更新したりせず、データにノックオン効果を及ぼすことになります。キー値を変更して、存在しない値を指すようにします。
参照整合性は、関連データが一貫した方法で保持されることを保証する優れた方法です。