テーブルの関係を理解する
SQL Serverは、リレーショナルデータベース内のテーブル間の関係を実装するために外部キーを追加します。テーブルは、保存するデータのタイプに応じて、別のテーブルと1対1、1対多、または多対多の関係を持つことができます。
1対1の関係は単純で、ほとんど使用されません。特定のテーブルの各レコードは、別のテーブルの1つのレコードに正確に関連しています。
たとえば、ユーザーの名前、ID、性別を1つのテーブル(ユーザー)に保存できます。 テーブル)とそのアドレスは別のテーブル(アドレス)に保存されます テーブル)。 ユーザーの各レコード テーブルは、アドレスの1つのレコードに対応します テーブル。逆に、アドレスの各アドレス テーブルは、ユーザーの1つのレコードにのみ属します。 テーブル。
1対多および多対多の関係ははるかに頻繁です。
組織の従業員、部門、従業員の保険会社、および従業員のオフィスの住所に関する情報を保存するシナリオを考えてみましょう。
従業員は1つの部門にのみ所属でき、1つの保険会社にのみ加入できると想定しています。ただし、部門や保険会社には複数の従業員がいる場合があります。 部門 および従業員 テーブルには1対多の関係があります。同様に、保険 および従業員のテーブル 1対多の関係になります。
また、組織に複数のオフィスがあり、従業員が複数のオフィスで働いている場合もあります。さらに、オフィスには複数の従業員を配置できます。この場合、 Office および従業員 テーブルには多対多の関係があります。
多対多の関係を実装するには、多対多の関係にある2つのテーブルを接続するルックアップテーブルを作成する必要があります。元のテーブルには、ルックアップテーブルとの1対多の関係が含まれています。
従業員の間に多対多の関係を構築することを検討しましょう およびOffice テーブル。新しいルックアップテーブルを作成しますEmployee_Office 。次に、従業員の間に1対多の関係を作成します およびEmployee_Office テーブルとOffice およびEmployee_Office テーブル。
ここで、外部キーがこのディスカッションにどのように適合するかを見てみましょう。
外部キーとは何ですか?複数の外部キーが必要な理由
リレーショナルデータベースでは、外部キーはさまざまなタイプのデータベース関係を実装します。
たとえば、SQL Serverで1対多の関係を実装するには、多くにあるテーブルに外部キーを追加する必要があります。 1対多の関係の側面。
外部キーは、 oneにあるテーブルの主キーまたは一意のIDキーを参照します テーブルの側面。したがって、部門間の1対多の関係では および従業員 上で説明したテーブル、従業員 テーブルには、 Departmentの主キーを参照する外部キーが格納されます。 テーブル。
テーブルが他の複数のテーブルと関係を持つ可能性があるシナリオでは、テーブルに複数の外部キーを追加する必要があります。 従業員の場合 テーブルでは、 Departmentの主キーを参照する外部キーを追加する必要があります 表と保険 テーブル。同様に、 Employee_Office ルックアップテーブルには、従業員の主キーを参照する2つの外部キーがあります。 およびOffice テーブル。
SQLServerで複数の外部キーを追加する
次の図は、簡単な例で実装するデータベーススキーマを示しています。
ここでは、データベースに5つのテーブルがあることがわかります。従業員 、保険 、部門 、オフィス 、および Employee_Office 。
部門 および従業員 テーブルには1対多の関係があります。同様に、保険 および従業員 テーブルにも1対多の関係があります。 オフィス および従業員テーブルには、 Employee_Officeとの2つの1対多の関係を使用して実装された多対多の関係があります。 ルックアップテーブル。
従業員 テーブルには2つの外部キーDep_Idがあります 、および Insur_Id Department の主キー(Id)を参照します および保険 それぞれテーブル。
次に、記述されたデータベースを作成するSQLスクリプトを実行しましょう。
外部キーなしでテーブルを作成することから始めます。まだ作成されていない他のテーブルを参照する外部キーを使用してテーブルを作成しようとすると、エラーが発生します。
データベーススキーマでは、 Department 、組織 、および Office テーブルには外部キーがありません。次のスクリプトは、 Organizationという名前のダミーデータベースを作成します それに3つのテーブルを追加します: Department 、保険 、および Office 。
CREATE DATABASE Organization
USE Organization
CREATE TABLE Department
(
Id INT PRIMARY KEY,
Name VARCHAR (50) NOT NULL
)
USE Organization
CREATE TABLE Insurance
(
Id INT PRIMARY KEY,
Name VARCHAR (50) NOT NULL
)
USE Organization
CREATE TABLE Office
(
Id INT PRIMARY KEY,
Name VARCHAR (50) NOT NULL
)
FOREIGN KEY REFERENCESを使用できます SQLServerで外部キー関係を実装するための制約。テーブル名を指定します。次に、外部キーを参照するための列名を括弧内に指定します。
次のスクリプトは、従業員を作成します 外部キーを持つテーブルDep_Id およびInsur_Id Departmentの参照ID列 および保険 それぞれテーブル。
USE Organization
CREATE TABLE Employee
(
Id INT PRIMARY KEY IDENTITY(1,1),
Name VARCHAR (50) NOT NULL,
Age INT,
Gender VARCHAR (50),
Dep_Id int FOREIGN KEY REFERENCES Department(Id),
Insur_Id int FOREIGN KEY REFERENCES Insurance(Id)
)
最後に、次のスクリプトは Employee_Officeを作成します 2つの外部キーを持つテーブルEmp_Id およびOffice_Id 。
USE Organization
CREATE TABLE Employee_Office
(
Id INT PRIMARY KEY IDENTITY(1,1),
Emp_Id int FOREIGN KEY REFERENCES Employee(Id),
Office_Id int FOREIGN KEY REFERENCES Office(Id)
)
複数の外部キーを持つテーブルへのレコードの挿入
複数の外部キーを持つテーブルにレコードを挿入するには、最初に、元のテーブルの外部キーによって参照される対応するレコードをテーブルに作成する必要があります。
実際には、従業員にレコードを挿入します テーブルでは、最初に Departmentに対応するレコードを作成する必要があります および保険 テーブル。 従業員が テーブルには、 Departmentを参照する外部キーが含まれています および保険 テーブル。
まず、従業員にレコードを追加しようとします Departmentを参照する外部キーを指定しないテーブル および従業員 テーブル。
INSERT INTO Employee
VALUES ('James', 10, 'Male'),
('Sara', 7, 'Female')
次のエラーが表示されます。これは、指定された値の数が従業員の列の数と一致しないために発生します テーブル。
Dep_Idにダミー値を追加してみましょう およびInsur_Id 列(外部キー):
INSERT INTO Employee
VALUES ('James', 10, 'Male', 2, 2),
('Sara', 7, 'Female', 1, 1)
DepartmentテーブルとInsuranceテーブルにはそれぞれID2と1のレコードがないため、次のエラーが表示されます。
部門にレコードを挿入しましょう 、保険 、および Office テーブル:
INSERT INTO Department
VALUES (1, 'Finance'),
(2, 'HR')
INSERT INTO Insurance
VALUES (1, 'Company A'),
(2, 'Company B')
INSERT INTO Office
VALUES (1, 'Paris'),
(2, 'London')
部門以降 および保険 テーブルにID2および1のレコードが含まれるようになり、従業員にレコードを挿入できます。 以下に示すように、対応する外部キー値を持つテーブル:
INSERT INTO Employee
VALUES ('James', 10, 'Male', 2, 2),
('Sara', 7, 'Female', 1, 1)
Employee_Officeにいくつかのレコードを挿入します テーブル。ただし、その前に、EmployeeテーブルのId列の値を見てみましょう。
SELECT * FROM Employee
従業員 列には、Id値が2と3のレコードが含まれています。 Employee_Officeにレコードを挿入できます。 Emp_Idが存在するテーブル 列には2または3が含まれ、 Office_Id 列に1または2が含まれています。
INSERT INTO Employee_Office
VALUES (2, 1),
(2, 2),
(3,2)
複数の外部キーを持つテーブルからのレコードの選択
複数の外部キーを持つテーブルからレコードを選択するには、JOINが必要です。
次のスクリプトは、名前の値を返します および性別 従業員の列 テーブルと名前 部門の列 および保険テーブル。 従業員以降 テーブルには2つの外部キーが含まれているため、2つの LEFT JOINを使用する必要があります ステートメント:
SELECT
Employee.Name AS Employee_Name,
Employee.Gender,
Department.Name as Department_Name,
Insurance.Name as Insurance
FROM Employee
LEFT JOIN Department ON Employee.Dep_Id = Department.Id
LEFT JOIN Insurance ON Employee.Insur_Id = Insurance.Id
同様に、名前の値を選択できます および性別 従業員の列 テーブルと名前 Officeの列 ルックアップテーブルで2つのLEFTJOINステートメントを使用するテーブルEmployee_Office 。
SELECT
Employee.Name AS Employee_Name,
Employee.Gender,
Office.Name as Office_Name
FROM Employee
LEFT JOIN Employee_Office ON Employee.Id = Employee_Office.Emp_Id
LEFT JOIN Office ON Office.Id = Employee_Office.Office_Id
複数の外部キーを持つテーブルからのレコードの削除
複数の外部キーを持つテーブルからレコードを削除できます。ただし、テーブルが別の列の外部キーによって参照されていないことを確認してください。
たとえば、部門からレコードを削除しないでください。 Emp_Idによって参照されるテーブル 従業員の外部キー テーブル。次に例を示します:
DELETE FROM Department WHERE Id = 1
DepartmentのId1のレコード以降 テーブルはEmp_Idによって参照されます 従業員の列 上記のエラーで述べたように、テーブルを削除することはできません。まず、従業員からすべてのレコードを削除する必要があります Emp_Idのテーブル は1です。
Employeeテーブルには、そのようなレコードが1つだけ含まれています(Id値は3)。次のクエリでそのレコードを削除してみましょう:
DELETE FROM Employee WHERE Id = 3
Employee_Officeが原因で発生するエラーが表示されます Emp_Idが含まれるレコードが含まれています 外部キー列には3つのレコードが含まれています。したがって、最初にそのレコードを削除する必要があります:
次のスクリプトは、 Emp_Idのレコードを削除します Employee_Officeからの値3 テーブル。
DELETE FROM Employee_Office WHERE Emp_Id = 3
最後に、次のスクリプトは、Id値が1のレコードを従業員から削除します。 および部門 列。
DELETE FROM Employee WHERE Id = 1
DELETE FROM Department WHERE Id = 1
結論
したがって、SQLクエリを使用して外部キーを追加することにより、SQLServerテーブルに複数の外部キーを追加することを検討しました。この記事で使用されているこれらの実用的な例が、このトピックを習得するのにも役立つことを願っています。
外部キーとテーブルの依存関係を処理して作業タスクを実行する場合は、ソフトウェアツールを使用してルーチンを簡素化することも役立ちます。テーブル間のすべての依存関係を表示するための専用ソリューションとして、ビジュアルデータベースダイアグラムを強くお勧めします。また、データベースドキュメンテーション機能の複雑さに関係なく、データベース全体の正確なドキュメントを生成できます。
これらのツールはどちらも、手動による負荷を軽減し、プロセスを自動化し、パフォーマンスを高速化して負担を軽減することを目的としています。