CONSTRAINT 句

制約 はインデックスに似ています。インデックスと違う点は、他のテーブルとのリレーションシップも設定できることです。

CONSTRAINT 句は、ALTER TABLE ステートメントおよび CREATE TABLE ステートメントの中で制約を作成または削除する場合に使用します。CONSTRAINT 句には、単一フィールドの制約を作成するものと、複数フィールドの制約を作成するものの 2 種類があります。

注: Microsoft Access データベース エンジンは、Microsoft Access データベース エンジン以外のデータベースでは CONSTRAINT 句やデータ定義言語ステートメントを使用できません。代わりに DAO の Create メソッドを使用してください。

構文

単一フィールド制約の場合:

CONSTRAINT name {PRIMARY KEY | UNIQUE | NOT NULL |
REFERENCES foreigntable [(foreignfield1, foreignfield2)]
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]}

複数フィールド制約の場合:

CONSTRAINT name
{PRIMARY KEY (primary1[, primary2 [, ...]]) |
UNIQUE (unique1[, unique2 [, ...]]) |
NOT NULL (notnull1[, notnull2 [, ...]]) |
FOREIGN KEY [NO INDEX] (ref1[, ref2 [, ...]]) REFERENCES foreigntable [(foreignfield1 [, foreignfield2 [, ...]])]
[ON UPDATE CASCADE | SET NULL]
[ON DELETE CASCADE | SET NULL]}

CONSTRAINT 句には、次の指定項目があります。

引数

説明

name

作成する制約の名前。

primary1, primary2

主キーに指定するフィールドの名前。

unique1, unique2

一意なキーに指定するフィールドの名前。

notnull1, notnull2

非 Null 値に制限されるフィールドの名前。

ref1, ref2

別のテーブルにあるフィールドを参照する外部キー フィールドの名前。

foreigntable

foreignfield で指定した 1 つ以上のフィールドのある外部テーブルの名前。

foreignfield1, foreignfield2

ref1ref2 で指定した foreigntable の 1 つ以上のフィールドの名前。参照されるフィールドが foreigntable の主キーである場合は、この句を省略できます。


解説

単一フィールドの制約の構文は、ALTER TABLE ステートメントや CREATE TABLE ステートメントなどのフィールド定義句の中で、フィールド データ型の指定の直後に記述します。

ALTER TABLE ステートメントや CREATE TABLE ステートメントのフィールド定義句以外の箇所で予約語 CONSTRAINT を使用する場合は、必ず複数フィールドの制約の構文を使用します。

CONSTRAINT 句を使用すると、次のいずれかの制約をフィールドに適用できます。

  • 予約語 UNIQUE を使用すると、フィールドを一意なキーとして指定できます。この結果、テーブルでこのフィールドの値を 2 つのレコードに同時に設定することはできなくなります。どのフィールドもフィールド一覧も一意なキーに指定することができます。複数フィールドの制約を一意なキーとして指定した場合は、インデックス内のすべてのフィールドの値の組み合わせが重複しないようにする必要があります。1 つのフィールドのみで複数のレコードが同じ値を持っている場合も同様です。

  • 予約語 PRIMARY KEY を使用すると、テーブル内の 1 つ以上のフィールド セットを主キーとして指定できます。主キーの値はすべて Null 値以外の一意な値である必要があります。1 つのテーブルに指定できる主キーは 1 つのみです。

    注: 既に主キーが設定されているテーブルには PRIMARY KEY 制約を設定しないでください。設定した場合はエラーになります。

  • 予約語 FOREIGN KEY を使用すると、指定したフィールドを外部キーにすることができます。外部テーブルの主キーが複数のフィールドから成る場合は、必ず複数フィールドの制約の定義を使用し、すべての参照元フィールド、外部テーブルの名前、および外部テーブルのすべての参照先フィールドの名前を、参照元フィールドと同じ順序でそれぞれ指定する必要があります。参照先フィールドが外部テーブルの主キーである場合は、参照先フィールドを指定する必要ありません。既定では、データベース エンジンは外部テーブルの主キーを参照先フィールドと見なします。

    外部キーの制約は、対応する主キーの値が変更されるときに行われる特定の動作を定義します。

  • 外部キー側のテーブルで行われる動作を指定することができます。この指定は、CONSTRAINT が定義されるテーブルの対応する主キーで行われる動作に基づきます。たとえば、Customers テーブルに関して次のような定義を考えます。

CREATE TABLE Customers (CustId INTEGER PRIMARY KEY, CLstNm NCHAR VARYING (50))

この Orders テーブルは、Customers テーブルの主キーを参照する外部キーのリレーションシップを定義しています。

CREATE TABLE Orders (OrderId INTEGER PRIMARY KEY, CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES Customers ON UPDATE CASCADE ON DELETE CASCADE

ON UPDATE CASCADE 句と ON DELETE CASCADE 句は、どちらも外部キー上に定義されます。ON UPDATE CASCADE 句は、Customers テーブルで顧客の情報 (CustId) が更新された場合、この更新が Orders テーブルをとおしてカスケードされることを意味します。各注文に含まれる、対応した顧客情報の値は、自動的に新しい値に更新されます。ON DELETE CASCADE 句は、Customers テーブルで顧客が削除された場合、Orders テーブルにある同じ顧客の顧客情報の値を含む行もすべて同様に削除されることを意味します。

CASCADE アクションの代わりに SET NULL アクションを使う、次のような Orders テーブルの異なる定義について検討します。

CREATE TABLE Orders (OrderId INTEGER PRIMARY KEY, CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES Customers ON UPDATE SET NULL ON DELETE SET NULL

ON UPDATE SET NULL 句は、Customers テーブルで顧客の情報 (CustId) が更新された場合、Orders テーブルの対応する外部キーの値が自動的に NULL に設定されることを意味します。同様に、ON UPDATE SET NULL 句は、顧客が Customers テーブルから削除された場合、Orders テーブルの対応するすべての外部キーの値が、自動的に NULL に設定されることを意味します。

外部キーに自動的にインデックスが作成されることを防ぐために、修飾子 NO INDEX を使用できます。この外部キーを定義する形式は、結果としてインデックスの値が頻繁に繰り返される場合に限り使用してください。外部キーのインデックスの値が頻繁に繰り返される中でインデックスを使用することは、単にテーブルのスキャンを行うよりも能率が下がります。テーブルから挿入や削除された行と一緒にこの種のインデックスを保守することは、パフォーマンスを下げるばかりで何の利益も生み出しません。



スキルを磨く
トレーニングの探索
新機能を最初に入手
Office Insider に参加する

この情報は役に立ちましたか?

ご意見をいただきありがとうございます。

フィードバックをお寄せいただき、ありがとうございます。Office サポートの担当者におつなぎいたします。

×