SQL Server外部キー
概要:このチュートリアルでは、SQL Server外部キー制約を使用して、二つのテーブル内のデータ間のリンクを強制す
SQL Server外部キー制約の概要
次のvendor_groups
およびvendors
テーブルについて考えてみましょう。
各ベンダーはベンダーグループに属し、各ベンダーグループにはゼロ以上のベンダーがある可能性があります。 vendor_groups
とvendors
テーブルの関係は一対多です。,
vendors
テーブルの各行について、vendor_groups
テーブルに対応する行をいつでも見つけることができます。ただし、現在のテーブル設定では、vendors
テーブルに行を挿入できます。vendor_groups
テーブルに対応する行はありません。 同様に、vendor_groups
テーブルの行を、vendors
テーブルの対応する行を更新または削除せずに削除することもできます。vendors
テーブル,
vendor_groups
とvendors
テーブルのデータ間のリンクを強制するには、vendors
テーブルに外部キーを確立する必要があります。外部キーは、別のテーブル(または自己参照の場合は同じテーブル)の行を一意に識別する、あるテーブル内の列または列のグループです。外部キーを作成するには、FOREIGN KEY
制約を使用します。,
次のステートメントは、vendors
テーブルを削除し、FOREIGN KEY
制約で再作成します。
vendor_groups
テーブルは、外部キー制約が参照するテーブルである親テーブルと呼ばれます。 vendors
テーブルは、外部キー制約が適用されるテーブルである子テーブルと呼ばれます。,
上記のステートメントでは、次の句はFOREIGN KEY
という名前の制約fk_group
を作成し、group_id
vendors
テーブルのgroup_id
vendor_groups
テーブル:
sql server外部キー制約構文
FOREIGN KEY
制約を作成するための一般的な構文は次のとおりです。
この構文を詳しく調べてみましょう。,
まず、FOREIGN KEY
CONSTRAINT
キーワードの後に制約名を指定します。 制約名はオプションであるため、次のようにFOREIGN KEY
制約を定義できます。
この場合、SQL ServerはFOREIGN KEY
制約の名前を自動的に生成します。
次に、FOREIGN KEY
キーワードの後に括弧で囲まれたカンマ区切りの外部キー列のリストを指定します。,
第三に、外部キーが参照する親テーブルの名前と、子テーブルの列とのリンクを持つコンマ区切りの列のリストを指定します。
SQL Server外部キー制約の例
まず、vendor_groups
テーブルにいくつかの行を挿入します。
次に、ベンダーグループを持つ新しいベンダーをvendors
テーブルに挿入します。
Code language: SQL (Structured Query Language) (sql)
ステートメントは期待どおりに機能しました。,
第三に、vendor_groups
テーブルにベンダーグループが存在しない新しいベンダーを挿入しようとします。
Code language: SQL (Structured Query Language) (sql)
SQL Serverは次のエラーを発行しました。
この例では、FOREIGN KEY
制約のため、SQL Serverは挿入を拒否し、エラーを発行しました。
参照アクション
外部キー制約により、参照の整合性が保証されます。 これは、親テーブルに対応する行がある場合にのみ、子テーブルに行を挿入できることを意味します。,
また、外部キー制約を使用すると、親テーブルの行が更新または削除されたときの参照アクションを次のように定義できます。
ON UPDATE
およびON DELETE
親テーブルの行が更新および削除されたときに実行するアクションを指定します。, 許可されているアクションは次のとおりです。NO ACTION
、CASCADE
、SET NULL
、およびSET DEFAULT
親テーブルの行の削除アクション
親テーブルの行を削除する場合は、次のいずれかのアクションを設定できます。
ON DELETE NO ACTION
:sql serverはエラーを発生させ、親テーブルの行に対するdeleteアクションをロールバックします。ON DELETE CASCADE
:SQL Serverは、親テーブルから削除された行に対応する子テーブルの行を削除します。,ON DELETE SET NULL
:親テーブルの対応する行が削除された場合、SQL Serverは子テーブルの行をNULL
に設定します。 このアクションを実行するには、外部キー列がnull許容である必要があります。ON DELETE SET DEFAULT
親テーブルの対応する行が削除された場合、SQL Serverは子テーブルの行を既定値に設定します。 このアクションを実行するには、外部キー列にデフォルトの定義が必要です。 デフォルト値が指定されていない場合、null許容列のデフォルト値はNULL
であることに注意してください。,既定では、アクションを明示的に指定しない場合、SQL ServerはON DELETE NO ACTION
を適用します。親テーブル内の行の更新アクション
親テーブル内の行を更新する場合は、次のいずれかのアクションを設定できます。
ON UPDATE NO ACTION
:SQL Serverでエラーが発生し、親テーブル内の行に対する更新アクションがロールバックされます。ON UPDATE CASCADE
:SQL Serverは、親テーブルの行が更新されると、子テーブルの対応する行を更新します。,ON UPDATE SET NULL
:SQL Serverは、親テーブルの対応する行が更新されると、子テーブルの行をNULL
に設定します。 このアクションを実行するには、外部キー列がnull許容である必要があります。ON UPDATE SET DEFAULT
:SQL Serverは、親テーブルの対応する行が更新された子テーブルの行の既定値を設定します。