SQLでは、外部キー制約を作成して関係を作成します。
具体的には、親テーブルと子テーブルがあります。親には主キーが含まれ、子テーブルには親テーブルの主キーを参照する外部キーが含まれます。
SQLを使用してリレーションシップを作成する場合、テーブルの作成時にリレーションシップを作成することも、後で(テーブルを変更して)作成することもできます。この記事では、両方のシナリオについて説明します。
テーブルを作成するときに関係を作成する
CREATE TABLE
内にリレーションシップを作成する例を次に示します。 テーブルを作成するときのステートメント。
CREATE TABLE Parent (
ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ChildName nvarchar(255) NOT NULL,
ParentId int NOT NULL
CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId)
);
ここで2つのテーブルを作成しました。 Parent
と呼ばれるもの もう1つはChild
と呼ばれます 。
子のテーブル定義内にリレーションシップを作成しました。関係はCONSTRAINT
で作成されます 口論。これはまだCREATE TABLE
内にあることに注意してください ステートメント。
関係には名前が必要です。この場合、私はそれをFK_Child_Parent
と呼びました 。 FOREIGN KEY
一部の後には、外部キーとなる(子テーブル内の)列の名前が続きます。
REFERENCES
partは、外部キーが参照する列を指定します。この場合、ParentId
を参照します Parent
の列 テーブル。これは、REFERENCES Parent (ParentId)
を使用して行われます。 。
関係を構築するために必要なのはこれだけです。
このページの例はSQLServerを使用して行われたことに注意してください。 DBMSによっては、列定義の詳細を変更する必要がある場合があります。
例:IDENTITY
AUTO_INCREMENT
と呼ばれることもあるSQLServerのバージョンです。 他のDBMS(MySQLなど)。 SQLiteを使用している場合は、SQLiteで自動インクリメント列を作成する方法は次のとおりです。
既存のテーブルに関係を追加する
ALTER TABLE
を使用するだけで、既存のテーブルにリレーションシップを追加することもできます。 ステートメント。
前の例の2つのテーブルを作成するときに、リレーションシップを作成しなかったとしましょう。代わりにこれを行ったとしましょう:
CREATE TABLE Parent (
ParentId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ParentName nvarchar(255) NOT NULL
)
CREATE TABLE Child (
ChildId int IDENTITY(1,1) NOT NULL PRIMARY KEY,
ChildName nvarchar(255) NOT NULL,
ParentId int NOT NULL
);
したがって、このシナリオでは、2つのテーブルを作成するだけでした。それらの間に関係は作成されませんでした。
さて、テーブルを作成した後、突然「ああ、関係を作成するのを忘れた!」と思い出しました。
問題ありません。これで実行できます:
ALTER TABLE Child
ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId);
終わり。前の例と同じ詳細を使用して、関係を追加しました。
SQLiteは、ALTER TABLE
を使用した外部キーの追加をサポートしていないことに注意してください。 声明。詳細については、SQLiteの既存のテーブルに外部キーを追加する方法を参照してください。
更新/削除時
デフォルトでは、SQLServerの関係はON DELETE NO ACTION
を使用して作成されます およびON UPDATE NO ACTION
。したがって、前の例はこの設定を使用して作成されました。
ただし、異なるDBMSは他のデフォルト設定を使用する場合があります。
どちらの方法でも、コードでこれを明示的に指定できます。したがって、前の例を次のように変更できます。
ALTER TABLE Child
ADD CONSTRAINT FK_Child_Parent FOREIGN KEY (ParentId)
REFERENCES Parent (ParentId)
ON DELETE NO ACTION
ON UPDATE NO ACTION;
これが実際に意味するのは、誰かが主キーのレコードを削除または更新しようとすると、エラーが発生し、変更がロールバックされるということです。これは、システムの参照整合性を損なう可能性のある変更を防ぐためのSQLServerの方法です。
基本的に、最初に関係を作成する理由は、参照整合性を適用するためです。
ただし、SQLServerでこれらの状況をどのように処理するかについてはいくつかのオプションがあります。
具体的には、次の値のいずれかを使用できます。
NO ACTION
:エラーが発生し、親テーブルの行に対する削除/更新アクションがロールバックされます。-
CASCADE
:対応する行が親テーブルから削除/更新された場合、対応する行は参照テーブルから削除/更新されます。 -
SET NULL
:外部キーを構成するすべての値がNULL
に設定されます 親テーブルの対応する行が削除または更新された場合。これには、外部キー列がnull許容である必要があります。 -
SET DEFAULT
:親テーブルの対応する行が削除または更新されると、外部キーを構成するすべての値がデフォルト値に設定されます。この制約を実行するには、すべての外部キー列にデフォルトの定義が必要です。列がNULL可能であり、明示的なデフォルト値が設定されていない場合、NULL
列の暗黙のデフォルト値になります。