CONSTRAINT (制約) はインデックスに似ています。インデックスと違う点は、ほかのテーブルとのリレーションシップも設定できることです。
CONSTRAINT 句は、ALTER TABLE ステートメントおよび CREATE TABLE ステートメントの中で制約を作成または削除する場合に使用します。CONSTRAINT 句には、単一フィールドの制約を作成するものと、複数フィールドの制約を作成するものの 2 種類があります。
メモ Microsoft Jet データベース エンジンは、Microsoft Jet データベース以外のデータベースでは CONSTRAINT 句や DDL (データ定義言語) ステートメントを使用できません。Microsoft Jet データベース以外のデータベースでは代わりに 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 | 引数 ref1、ref2 で指定した引数 foreigntable の 1 つ以上のフィールドの名前。複数指定もできます。参照されるフィールドが引数 foreigntable の主キーである場合は、この句を省略できます。 |
単一フィールドの CONSTRAINT 構文は、ALTER TABLE ステートメントや CREATE TABLE ステートメントなどのフィールド定義句の中で、フィールド データ型の指定の直後に記述します。
ALTER TABLE ステートメントや CREATE TABLE ステートメントのフィールド定義句以外の箇所で予約語 CONSTRAINT を使用する場合は、必ず複数フィールドの CONSTRAINT 構文を使用します。
CONSTRAINT 句を使用すると、次のいずれかの制約をフィールドに適用できます。
予約語 UNIQUE を使用すると、フィールドを一意なキーとして指定します。この結果、テーブルでこのフィールドの値を 2 つのレコードに同時に設定することはできなくなります。どのフィールドでも一意なキーに指定することができます。数にも制限はありません。複数フィールドの制約を一意なキーとして指定した場合は、インデックス内のすべてのフィールドの値の組み合わせが重複しないようにする必要があります。ただし、1 つのフィールドのみで複数のレコードが同じ値を持っていてもかまいません。
予約語 PRIMARY KEY を使用すると、テーブル内の 1 つ以上のフィールド セットを主キーとして指定します。主キーの値はすべて Null 値以外の一意な値である必要があります。1 つのテーブルに指定できる主キーは 1 つのみです。
メモ 既に主キーが設定されているテーブルには PRIMARY KEY 制約を設定しないでください。設定した場合はエラーになります。
予約語 FOREIGN KEY を使用すると、指定したフィールドが外部キーになります。外部キー側のテーブルの主キーが複数のフィールドから成る場合は、必ず複数フィールドの制約の定義を使用し、すべての参照元フィールド、外部キー側のテーブル名、および外部キー側のテーブルのすべての参照先フィールドの名前を、それぞれ指定してください。この場合は、参照先フィールドは参照元フィールドと同じ順序で指定してください。既定では、データベース エンジンは外部キー側のテーブルの主キーを参照先フィールドとみなします。このため、参照先フィールドが外部キー側のテーブルの主キーである場合は、参照先フィールドを指定する必要ありません。
外部キーの制約は、対応する主キーの値が変更されるときに行われる特定の動作を定義します。
外部キー側のテーブルで行われる動作を指定することが出来ます。この指定は、CONSTRAINT が定義されるテーブルの対応する主キーで行われる動作に基づきます。たとえば、[顧客] テーブルに関して次のような定義を考えます。
CREATE TABLE 顧客 (CustId INTEGER PRIMARY KEY, CLstNm NCHAR VARYING (50))
[注文] テーブルの次のような定義を考えます。この [注文] テーブルは、[顧客] テーブルの主キーを参照する外部キーのリレーションシップを定義しています。
CREATE TABLE 注文 (OrderId INTEGER PRIMARY KEY, CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES 顧客 ON UPDATE CASCADE ON DELETE CASCADE
ON UPDATE CASCADE 句と ON DELETE CASCADE 句は、どちらも外部キー上に定義されます。ON UPDATE CASCADE 句は、[顧客] テーブルで顧客の情報 (CustId) が更新された場合、この更新が [注文] テーブルを通してカスケードされることを意味します。各注文に含まれる、対応した顧客情報の値は、自動的に新しい値に更新されます。ON DELETE CASCADE 句は、[顧客] テーブルで顧客が削除された場合、[注文] テーブルにある同じ顧客の顧客情報の値を含む行もすべて同様に削除されることを意味します。
CASCADE アクションの代わりに SET NULL アクションを使う、次のような [注文] テーブルの異なる定義について検討します。
CREATE TABLE 注文 (OrderId INTEGER PRIMARY KEY, CustId INTEGER, OrderNotes NCHAR VARYING (255), CONSTRAINT FKOrdersCustId FOREIGN KEY (CustId) REFERENCES 顧客 ON UPDATE SET NULL ON DELETE SET NULL
ON UPDATE SET NULL 句は、[顧客] テーブルで顧客の情報 (CustId) が更新された場合、[注文] テーブルの対応する外部キーの値が自動的に NULL に設定されることを意味します。同様に、ON UPDATE SET NULL 句は、顧客が [顧客] テーブルから削除された場合、[注文] テーブルの対応するすべての外部キーの値が、自動的に NULL に設定されることを意味します。
外部キーに自動的にインデックスが作成されることを防ぐために、修飾子 NO INDEX を使用できます。この外部キーを定義する形式は、結果としてインデックスの値が頻繁に繰り返される場合に限り使用してください。外部キーのインデックスの値が頻繁に繰り返される中でインデックスを使用することは、単にテーブルのスキャンを行うよりも能率が下がります。テーブルから挿入や削除された行と一緒にこの種のインデックスを保守することは、パフォーマンスを下げるばかりで何の利益も生み出しません。
CREATE TABLE ステートメント、CONSTRAINT 句の使用例