次の方法で共有


CONSTRAINT 句 (Microsoft Access SQL)

適用先: Access 2013、Office 2013

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

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

注:

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

構文

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

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

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

CONSTRAINT {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

作成する制約の名前。

primary1primary2

主キーに指定するフィールドの名前。複数指定もできます。

unique1unique2

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

notnull1, notnull2

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

ref1ref2

別のテーブルにあるフィールドを参照する外部キー フィールドの名前。複数指定もできます。

foreigntable

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

foreignfield1foreignfield2

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

注釈

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

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

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

  • UNIQUE 予約語を使用して、フィールドを一意のキーとして指定できます。 これは、テーブル内の 2 つのレコードがこのフィールドで同じ値を持つことができないことを意味します。 任意のフィールドまたはフィールドの一覧を一意として制限できます。 複数フィールド制約が一意キーとして指定されている場合、1 つのフィールドで 2 つ以上のレコードの値が同じである場合でも、インデックス内のすべてのフィールドの結合値は一意である必要があります。

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

    注:

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

  • FOREIGN KEY 予約語を使用して、フィールドを外部キーとして指定できます。 外部テーブルの主キーが複数のフィールドで構成されている場合は、複数フィールド制約定義を使用し、参照元フィールドのすべて、外部テーブルの名前、および外部テーブル内の参照フィールドの名前を、参照元フィールドが一覧表示される順序と同じ順序で一覧表示する必要があります。 参照されるフィールドが外部テーブルの主キーである場合は、参照されるフィールドを指定する必要はありません。 既定では、データベース エンジンは外部テーブルの主キーが参照フィールドであるかのように動作します。 外部キー制約は、対応する主キー値が変更されたときに実行される特定のアクションを定義します。

  • CONSTRAINT が定義されているテーブルの主キーに対して実行される対応するアクションに基づいて、外部テーブルに対して実行するアクションを指定できます。 たとえば、テーブル Customers の次の定義を考えてみましょう。

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

    Orders テーブルの次のような定義を考えます。この 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 を使用できます。 この外部キーを定義する形式は、結果としてインデックスの値が頻繁に繰り返される場合に限り使用してください。 外部キーのインデックスの値が頻繁に繰り返される中でインデックスを使用することは、単にテーブルのスキャンを行うよりも能率が下がります。 テーブルから挿入や削除された行と一緒にこの種のインデックスを保守することは、パフォーマンスを下げるばかりで何の利益も生み出しません。

次の使用例では、2 つのテキスト フィールドを含む "ThisTable" という名前の新しいテーブルを作成します。

 Sub CreateTableX1()    
Dim dbs As Database 
 
    ' Modify this line to include the path to Northwind 
    ' on your computer. 
    Set dbs = OpenDatabase("Northwind.mdb") 
 
    ' Create a table with two text fields. 
    dbs.Execute "CREATE TABLE ThisTable " _ 
        & "(FirstName CHAR, LastName CHAR);" 
 
    dbs.Close 
 
End Sub

次の使用例では、テキスト フィールド 2 つと日付/時刻型 (Date/Time) フィールド、および 3 つのフィールドすべてから作成された一意のインデックスを含む、"MyTable" というテーブルを作成します。

    Sub CreateTableX2() 
     
        Dim dbs As Database 
     
        ' Modify this line to include the path to Northwind 
        ' on your computer. 
     
        Set dbs = OpenDatabase("Northwind.mdb") 
     
        ' Create a table with three fields and a unique 
        ' index made up of all three fields. 
        dbs.Execute "CREATE TABLE MyTable " _ 
            & "(FirstName CHAR, LastName CHAR, " _ 
            & "DateOfBirth DATETIME, " _ 
            & "CONSTRAINT MyTableConstraint UNIQUE " _ 
            & "(FirstName, LastName, DateOfBirth));" 
     
        dbs.Close 
     
    End Sub

次の使用例では、2 つのテキスト フィールドおよび整数型 ( Integer ) フィールドを含む新しいテーブルを作成します。 SSN フィールドは主キーです。

    Sub CreateTableX3() 
     
         Dim dbs As Database 
     
        ' Modify this line to include the path to Northwind 
        ' on your computer. 
        Set dbs = OpenDatabase("Northwind.mdb") 
     
        ' Create a table with three fields and a primary 
        ' key. 
        dbs.Execute "CREATE TABLE NewTable " _ 
            & "(FirstName CHAR, LastName CHAR, " _ 
            & "SSN INTEGER CONSTRAINT MyFieldConstraint " _ 
            & "PRIMARY KEY);" 
     
        dbs.Close 
     
    End Sub