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 つのフィールドだけで 2 つ以上のレコードが同じ値を持つ場合でも、インデックス内のすべてのフィールドの結合された値は一意である必要があります。

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

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

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

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

  • CONSTRAINT が定義されているテーブルの主キーに対して実行される対応するアクションに基づいて、外部テーブルに対して実行されるアクションを指定できます。 たとえば、"顧客" テーブルに対して次の定義を検討してください。

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 のスキルを磨く
トレーニングの探索
新機能を最初に入手
Office Insider に参加する

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

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

×