私が使用しているフレームワーク (yii) のドキュメントでこの用語 (複合外部キー) を参照してください。複合外部キー (mySql データベース内) とは何ですか?
(私の推測では、2 つのテーブル間の関係を考えると、一方のテーブルには、もう一方のテーブルの ID とまったく同じ名前の列があります。 )
*免責事項: 私はデューデリジェンスを行い、これを 2 分間ほど Google で検索しましたが、この用語の決定的な定義は見つかりませんでした..
ユーザーのテーブルがあるとします。
+---------+----------+------------+------------+-- --------------+ | | 姓 | 名 | 郵便番号 | 生年月日 | メール | +---------+----------+------------+------------+-- --------------+ | | ジョーンズ | ジョン | ジョン | 60612-0344 | 1970-02-14 | john@jones.com | | | ジョーンズ | ジェーン | 60612-0344 | 1971-05-26 | ジェーン@ジョーンズ.com | | | スミス | サラ | 19002-0052 | 1982-06-21 | sara@smith.com | +---------+----------+------------+------------+-- --------------+
このアプリケーションでは、すべてのユーザーが独自の電子メール アドレスを持っている必要があるため、Email
列の値によってテーブル内のレコードを一意に識別できます。これは、テーブルへのキーを形成します。このようなキー (単一の列に対して定義されている) は、simpleと呼ばれます。
状況によっては、2 人のユーザーが同じ名前、生年月日、郵便番号を持つことはできないことがわかっている場合があります。その場合、別の可能なキーは(Surname, Forename, ZIP, DOB)
. このようなキー (複数の列で定義されている) は、複合キーと呼ばれます。
各レコードのキーは (定義により) そのレコードに対して一意である必要があるため、関連する列にインデックスを定義することによって、そのような一意性制約を強制するように MySQL に指示できUNIQUE
ます (テーブルのインデックスPRIMARY KEY
は特殊なタイプのUNIQUE
インデックスです)。既存のレコードと同じキーを持つレコードは失敗します。
注文のテーブルがあるとします。
+--------------+----------+---------+----------+ | | 注文番号 | ステータス | 合計 | 顧客 | +--------------+----------+---------+----------+ | | 12345 | 完了 | 1234.99 | ? | | | | 12346 | 保留中 | 345.00 | ? | | | | 12347 | キャンセル | 9876.50 | ? | | +--------------+----------+---------+----------+
オーダーを users テーブルの関連するレコードに関連付けたいと考えています。しかし、それを行う方法は?列には何を入れCustomer
ますか?
users テーブルで一意のレコードを識別したいのは明らかなので、そのキーの 1 つを使用する必要があります (Email
上記の最初の例のように)。このように、あるテーブルのキーを使用して別のテーブルのレコードを参照することは、リレーショナル データベースでは非常に一般的です。このような状況では、参照元の列を外部キーと呼びます(外部テーブルへのキーを保持しているため)。
参照に複合キーを使用する必要がある場合は、複合外部キーがあります。上記の 2 番目の例では、orders テーブルに列Customer_Surname
、Customer_Forename
、Customer_ZIP
およびCustomer_DOB
が含まれている可能性があります。これらは一緒になって users テーブルへの外部キーを形成します (この場合、そのようなスキーマはお勧めしません)。
MySQL は、外部キー制約を強制する (参照されるレコードが外部テーブルに存在することを保証する) だけでなく、参照されるレコード自体が更新または削除された場合に、参照 (注文) テーブルを自動的に更新または削除することもできます。たとえば、John が users テーブルから削除された場合、彼の注文はすべて orders テーブルから自動的に削除される可能性があります (この場合も、おそらく望んでいないことでしょう)。または、電子メール アドレスが変更された場合、Customer
列が自動的に更新される可能性があります。
は、エンティティの出現を一意に識別するための複数の属性composite key
で構成されます。これは、キーを構成する 1 つ以上の属性がそれ自体では単純なキーではないという点で、複合キーとは異なります。
たとえば、CD コレクションを保持するデータベースがあるとします。エンティティの 1 つはトラックと呼ばれ、CD 上のトラックの詳細を保持します。これは、CD名、トラック番号の複合キーを持っています。
トラック エンティティ内の CD 名は、CD エンティティにリンクする単純なキーですが、トラック番号自体は単純なキーではありません。