SQL Server
 Computer >> コンピューター >  >> プログラミング >> SQL Server

SQL Serverの外部キー(FOREIGN KEY)とは?作成方法を構文と実例でわかりやすく解説

このチュートリアルでは、SQL Serverにおける外部キー(Foreign Key)の使い方を、構文と具体例を交えながら詳しく解説します。

SQL Serverの外部キーとは?

外部キーは、SQL Serverデータベース内のテーブル間に参照整合性を持たせるために使用されます。外部キーが設定された列の値は、必ず参照先の別テーブルに存在していなければなりません。

参照される側のテーブルを「親テーブル」、外部キーを持つ側のテーブルを「子テーブル」と呼びます。子テーブルの外部キーは、通常、親テーブルの主キー(PRIMARY KEY)を参照します。

外部キーは、CREATE TABLE文またはALTER TABLE文のいずれかを使用して作成できます。

CREATE TABLE文で外部キーを作成する

構文

CREATE TABLE bang_con (
  cot1 kieudulieu [ NULL | NOT NULL ],
  cot2 kieudulieu [ NULL | NOT NULL ],
  …
  CONSTRAINT fk_ten
  FOREIGN KEY (cot_con1, cot_con2, … cot_con_n)
  REFERENCES bang_me (cot_me1, cot_me2, … cot_me_n)
  [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
  [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ]
);

パラメータの説明

  • bang_con:作成する子テーブルの名前。
  • cot1, cot2:テーブルに作成する列。各列には1つのデータ型を指定し、NULLまたはNOT NULLを明示します。省略した場合のデフォルトはNULLです。
  • fk_ten:作成する外部キー制約の名前。
  • cot_con1, cot_con2, … cot_con_n:bang_con内で、bang_meの主キーを参照する列。
  • bang_me:bang_conで使用される主キーを含む親テーブルの名前。
  • cot_me1, cot_me2, … cot_me_n:bang_meの主キーを構成する列。外部キーは、bang_conのcot_con1〜cot_con_nとの間に制約を作成します。

ON DELETE / ON UPDATE の動作オプション

  • ON DELETE(省略可能):親テーブルのデータが削除されたときに、子テーブルのデータをどう扱うかを指定します。NO ACTION、CASCADE、SET NULL、SET DEFAULTから選択します。
  • ON UPDATE(省略可能):親テーブルのデータが更新されたときに、子テーブルのデータをどう扱うかを指定します。選択肢はON DELETEと同じです。

各オプションの意味は以下の通りです。

  • NO ACTION:親データが削除・更新されても、子データには何もしません。
  • CASCADE:親データが削除・更新されると、対応する子データも自動的に削除・更新されます。
  • SET NULL:親データが削除・更新されると、子データはNULLに設定されます。
  • SET DEFAULT:親データが削除・更新されると、子データはデフォルト値に設定されます。

関連トピック

  • SQL Serverの外部キー(カスケード削除:Cascade Delete)
  • SQL Serverの外部キー(SET NULLの設定)

例1:単一列の外部キーを作成する

CREATE TABLE sanpham (
  id_sanpham INT PRIMARY KEY,
  ten_sanpham VARCHAR(50) NOT NULL,
  phan_loai VARCHAR(25)
);

CREATE TABLE hangtonkho (
  id_hangtonkho INT PRIMARY KEY,
  id_sanpham INT NOT NULL,
  soluong INT,
  luong_toithieu INT,
  luong_toida INT,
  CONSTRAINT fk_htk_id_sanpham
  FOREIGN KEY (id_sanpham)
  REFERENCES sanpham (id_sanpham)
);

この例では、まず親テーブルとなるsanphamテーブルを、id_sanphamを主キーとして作成しています。続いて、子テーブルであるhangtonkhoテーブルを作成します。

hangtonkhoテーブルのCREATE TABLE文の中で、fk_htk_id_sanphamという名前の外部キーを定義しています。この外部キーにより、hangtonkhoテーブルのid_sanpham列とsanphamテーブルのid_sanpham列の間に関連付けが確立されます。

例2:複数列の外部キーを作成する

上の例は1列だけの外部キーでしたが、次に複数の列で構成される外部キーの作成方法を見てみましょう。

CREATE TABLE sanpham (
  ten_sanpham VARCHAR(50) NOT NULL,
  diadiem VARCHAR(50) NOT NULL,
  phanloai VARCHAR(25),
  CONSTRAINT sanpham_pk PRIMARY KEY (ten_sanpham, diadiem)
);

CREATE TABLE hangtonkho (
  id_hangtonkho INT PRIMARY KEY,
  ten_sanpham VARCHAR(50) NOT NULL,
  diadiem VARCHAR(50) NOT NULL,
  soluong INT,
  luong_toithieu INT,
  luong_toida INT,
  CONSTRAINT fk_htk_sanpham
  FOREIGN KEY (ten_sanpham, diadiem)
  REFERENCES sanpham (ten_sanpham, diadiem)
);

この例では、親テーブルsanphamの主キーがten_sanphamdiadiemの2列で構成されています。そのため、子テーブルの外部キーもこの2つの列を参照する必要があります。

ALTER TABLE文で外部キーを作成する

すでに存在するテーブルに後から外部キーを追加したい場合は、ALTER TABLE文を使用します。

構文

ALTER TABLE bang_con
ADD CONSTRAINT fk_ten
  FOREIGN KEY (cot_con1, cot_con2, … cot_con_n)
  REFERENCES bang_me (cot_me1, cot_me2, … cot_me_n);

パラメータの説明

  • bang_con:外部キーを追加する子テーブルの名前。
  • fk_ten:作成する外部キー制約の名前。
  • cot_con1, cot_con2, … cot_con_n:bang_con内で、bang_meの主キーを参照する列。
  • bang_me:bang_conで使用される主キーを含む親テーブルの名前。
  • cot_me1, cot_me2, … cot_me_n:bang_meの主キーを構成する列。外部キーは、bang_conのcot_con1〜cot_con_nとの間に制約を作成します。

例1:単一列の外部キーを追加する

ALTER TABLE hangtonkho
ADD CONSTRAINT fk_htk_id_sanpham
  FOREIGN KEY (id_sanpham)
  REFERENCES sanpham (id_sanpham);

この例では、hangtonkhoテーブルにfk_htk_id_sanphamという名前の外部キーを作成し、id_sanpham列を介してsanphamテーブルを参照しています。

例2:複数列の外部キーを追加する

複数の列で構成される外部キーも、以下のように作成できます。

ALTER TABLE hangtonkho
ADD CONSTRAINT fk_htk_sanpham
  FOREIGN KEY (ten_sanpham, diadiem)
  REFERENCES sanpham (ten_sanpham, diadiem);

上記の例では、hangtonkhoテーブルにfk_htk_sanphamという名前の外部キーを作成し、ten_sanpham列とdiadiem列を基準にsanphamテーブルを参照しています。

  1. RDBMSの外部キー(Foreign Key)とは?主キーとの関係を具体例で解説

    外部キー(Foreign Key)とは外部キー(Foreign Key)とは、複数のテーブル同士をつなぐリンクを作成するための仕組みです。あるテーブルの列が、別のテーブルの主キー(Primary Key)を参照することで、テーブル間の関連性を表現できます。外部キーを設定することで、データベースは「参照先に存在しない値」の登録を防ぎ、データの一貫性(参照整合性)を保つことができます。ここでは、Employee(従業員)テーブルの「DeptID」を例に、外部キーの働きを見ていきましょう。テーブル例1:Employee(従業員テーブル)EmpIDEmpNameEmpAgeDeptIDテーブル例2:D

  2. SQL ServerのPIVOT句とは?クロス集計で行を列に変換する方法を実例付きで解説

    SQL Server(Transact-SQL)では、PIVOT句を使用することで、クロス集計(ピボットテーブル)を作成できます。PIVOT句は、テーブル内の行データを列に変換し、集計結果を見やすい形式で表示するための強力な機能です。 下図は、合計値を計算し、行データを列に変換して表示する例です。 PIVOT句の基本構文 SELECT cot_dautien AS bidanh_cot_dautien, [giatri_chuyen1], [giatri_chuyen2], … [giatri_chuyen_n] FROM ( SELECT bang_nguon.cot1