データベースで最も重要な概念の1つは、データベーステーブル間の関係を作成することです。 これらの関係は、複数のテーブルに格納されたデータをリンクし、効率的な方法で取得するメカニズムを提供します。 2つの表間にリンクを作成するには、別の表の列を参照する外部キーを1つの表に指定する必要があります。
データベーステーブルとリレーションシップ
データベースは、Microsoft Excelなどのスプレッドシートプログラムで既に使用されているものと同様に、一連のテーブルであることはすでに知っているかもしれません。 実際には、Excelスプレッドシートをデータベースに変換することもできます。 ただし、データベースがスプレッドシートと異なる場合は、テーブル間の強力な関係を構築することになります。
たとえば、企業が人事情報を追跡するために使用するデータベースを考えてみましょう。 そのデータベースには、社員の各メンバーの次の情報を含む従業員という表があります。
- 従業員ID
- ファーストネーム
- 苗字
- オフィスの電話
- 自宅の電話
- PositionID
この例では、従業員IDは、データベースに追加されるときに各従業員に割り当てられる固有に生成された整数です。 位置IDは、会社内の従業員の位置を参照するために使用されるジョブコードです。 このスキームでは、従業員は1つのポジションしか持たないが、複数の従業員が各ポジションを埋めることができる。 たとえば、「キャッシャー」ポジションの何百人もの従業員がいるとします。
データベースには、Positionsという表が含まれ、各位置に関する次の追加情報も含まれます。
- PositionID
- タイトル
- 職務レベル
- スキルカテゴリ
- ロケーション
このテーブルの[位置ID]フィールドは、[社員]テーブルの[社員ID]フィールドに似ています。位置がデータベースに追加されたときに作成される一意に生成された整数です。
私たちがデータベースから従業員のリストを引っ張って行くときは、それぞれの人の名前とそのタイトルを要求するのが自然でしょう。 ただし、この情報は複数のデータベーステーブルに格納されるため、テーブル間に既存の関係が必要なJOINクエリを使用してのみ取得できます。
テーブルの構造を見ると、関係を定義するフィールドはおそらく明白です - 位置IDフィールド。 各従業員は1つのポジションのみを持つことができ、ポジションはポジションテーブルの対応するエントリからのポジションIDを含むことによって識別されます。 この例では、Positionsテーブルの主キーであることに加えて、Position IDフィールドは、EmployeesテーブルからPositionsテーブルへの外部キーです。 データベースはこのフィールドを使用して複数のテーブルの情報を相互に関連付け、データベースへの変更や追加が引き続き参照整合性を維持するようにします 。
外部キーを特定したら、次のクエリを使用してデータベースから目的の情報を取得できます。
SQL Serverでの外部キーの作成
技術的には、上のようなクエリを実行できるように、関係を明示的に定義する必要はありません。 ただし、外部キー制約を使用してリレーションシップを明示的に定義すると、データベースでいくつかのハウスキーピング作業を実行できます。
- Employeesテーブルに新しいレコードを追加すると、入力したPosition IDがPositionsテーブルの有効な主キーになります。
- ポジションテーブルのポジションIDを変更すると、データベースはEmployeesテーブルの必要な更新を実行して一貫性を保つことができます。
- データベースは、対応する従業員エントリを持つ位置の削除を拒否するか、または関連するすべての従業員のカスケード削除を実行することによって、ポジションテーブルからのポジションの削除の影響を防ぐことができます。
SQL Serverで外部キーを作成する方法は次のとおりです。
ALTER TABLE従業員は、FOREIGN KEY(PositionID)を追加します。REFERENCES位置(PositionID)句を追加してテーブルを作成するときに、外部キーを作成することもできます。
外部キー参照位置(PositionID)外部キー列の列定義の最後に追加します。