CREATE | ALTER TABLE ... CONSTRAINT

このトピックでは、 CREATE TABLE または ALTER TABLE ステートメントで、 CONSTRAINT 句を指定して制約を作成する方法について説明します。

  • インライン制約は、個々の列定義の一部として指定されます。

  • アウトライン制約は、独立した句として指定されます。

    • テーブルを作成するとき、句はテーブルの列定義の一部です。

    • テーブルを変更する場合、句はテーブルの明示的な ADD アクションとして指定されます。

詳細な例を含む詳細については、 制約 をご参照ください。

構文

インライン一意/プライマリ/外部キー

CREATE TABLE <name> ( <col1_name> <col1_type>    [ NOT NULL ] { inlineUniquePK | inlineFK }
                     [ , <col2_name> <col2_type> [ NOT NULL ] { inlineUniquePK | inlineFK } ]
                     [ , ... ] )

ALTER TABLE <name> ADD COLUMN <col_name> <col_type> [ NOT NULL ] { inlineUniquePK | inlineFK }
Copy

条件:

inlineUniquePK ::=
  [ CONSTRAINT <constraint_name> ]
  { UNIQUE | PRIMARY KEY }
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ { ENABLE | DISABLE } ]
  [ { VALIDATE | NOVALIDATE } ]
  [ { RELY | NORELY } ]
Copy
inlineFK :=
  [ CONSTRAINT <constraint_name> ]
  [ FOREIGN KEY ]
  REFERENCES <ref_table_name> [ ( <ref_col_name> ) ]
  [ MATCH { FULL | SIMPLE | PARTIAL } ]
  [ ON [ UPDATE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]
       [ DELETE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ] ]
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ { ENABLE | DISABLE } ]
  [ { VALIDATE | NOVALIDATE } ]
  [ { RELY | NORELY } ]
Copy

アウトラインの一意/プライマリ/外部キー

CREATE TABLE <name> ... ( <col1_name> <col1_type>
                         [ , <col2_name> <col2_type> , ... ]
                         [ , { outoflineUniquePK | outoflineFK } ]
                         [ , { outoflineUniquePK | outoflineFK } ]
                         [ , ... ] )

ALTER TABLE <name> ... ADD { outoflineUniquePK | outoflineFK }
Copy

条件:

outoflineUniquePK ::=
  [ CONSTRAINT <constraint_name> ]
  { UNIQUE | PRIMARY KEY } ( <col_name> [ , <col_name> , ... ] )
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ { ENABLE | DISABLE } ]
  [ { VALIDATE | NOVALIDATE } ]
  [ { RELY | NORELY } ]
Copy
outoflineFK :=
  [ CONSTRAINT <constraint_name> ]
  FOREIGN KEY ( <col_name> [ , <col_name> , ... ] )
  REFERENCES <ref_table_name> [ ( <ref_col_name> [ , <ref_col_name> , ... ] ) ]
  [ MATCH { FULL | SIMPLE | PARTIAL } ]
  [ ON [ UPDATE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]
       [ DELETE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ] ]
  [ [ NOT ] ENFORCED ]
  [ [ NOT ] DEFERRABLE ]
  [ INITIALLY { DEFERRED | IMMEDIATE } ]
  [ { ENABLE | DISABLE } ]
  [ { VALIDATE | NOVALIDATE } ]
  [ { RELY | NORELY } ]
Copy

制約のプロパティ

他のデータベースとの互換性のために、Snowflakeは制約プロパティを提供します。制約に指定できるプロパティは、タイプによって異なります。

  • 一部のプロパティはすべてのキー(一意、プライマリ、および外部)に適用されます。

  • 他のプロパティは外部キーにのみ適用されます。

重要

これらのプロパティは、他のデータベースからの移行を容易にするために提供されています。Snowflakeによって強制保守 されていません。これは、これらのプロパティのデフォルトを変更できることを意味しますが、デフォルトを変更すると、Snowflakeが制約を作成 しなくなります

詳細については、 制約のプロパティ をご参照ください。

プロパティ(すべてのキー用)

次の制約プロパティはすべてのキーに適用されます(プロパティの順序は交換可能です)。

[ NOT ] ENFORCED
[ NOT ] DEFERRABLE
INITIALLY { DEFERRED | IMMEDIATE }
{ ENABLE | DISABLE }
{ VALIDATE | NOVALIDATE }
{ RELY | NORELY }
Copy
  • { VALIDATE | NOVALIDATE } { ENFORCED | NOT ENFORCED } または { ENABLE | DISABLE } が指定されている場合にのみ適用されます。

  • { RELY | NORELY } NOVALIDATE が指定されている場合にのみ適用されます。

  • デフォルト:

    NOT ENFORCED DEFERRABLE INITIALLY DEFERRED DISABLE NOVALIDATE NORELY

プロパティ(外部キーのみ)

次の制約プロパティは、外部キーに のみ 適用されます(プロパティの順序は交換可能)。

MATCH { FULL | SIMPLE | PARTIAL }
ON [ UPDATE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]
   [ DELETE { CASCADE | SET NULL | SET DEFAULT | RESTRICT | NO ACTION } ]
Copy
  • MATCH ... は、1つ以上の列の NULL 値に関して外部キー制約が満たされるかどうかを指定します。

  • ON ... は、外部キーの主キーが更新または削除されたときに実行されるアクションを指定します。

  • デフォルト:

    MATCH FULL UPDATE NO ACTION DELETE NO ACTION

使用上の注意

  • NOT NULL 列がNULL値を許可しないことを指定します。

    • これはSnowflakeによって強制される 唯一の 制約です。 参照整合性制約 をご参照ください。

    • 列定義内のインライン制約としてのみ指定できます。

    • デフォルトでは、列に NULL 値を許可します。

  • 複数列の制約(例: 複合一意キーまたは主キー)は、アウトラインでのみ定義できます。

  • インラインまたはアウトラインの外部キーを定義する場合、外部キー列と参照先テーブルの主キー列の署名(つまり、名前とデータ型)が完全に一致すれば、参照先テーブルの列名を指定する必要はありません。

  • 外部キーを作成する場合、 REFERENCES 句の列は、主キーの列と同じ順序でリストする必要があります。例:

    create table parent ... constraint primary_key_1 primary key (c_1, c_2) ...
    create table child  ... constraint foreign_key_1 foreign key (...) REFERENCES parent (c_1, c_2) ...
    
    Copy

    どちらの場合も、列の順序は c_1, c_2 です。外部キーの列の順序が異なっていた場合(例: c_2, c_1)、外部キーを作成する試みは失敗していました。

以下の例は、テーブルの作成中に単純な NOT NULL 制約を作成し、テーブルの変更中に別の NOT NULL 制約を作成する方法を示しています。

テーブルを作成し、同時に制約を作成します。

CREATE TABLE table1 (
    col1 INTEGER NOT NULL
    );
Copy

テーブルを変更して、制約付きの列を追加します。

ALTER TABLE table1 
    ADD COLUMN col2 VARCHAR NOT NULL;
Copy

次の例では、列の意図が一意の値を保持することを指定していますが、制約が実際に適用されていないことを明確にします。この例は、制約の名前(この場合は「uniq_col3」)の指定方法も示しています。

ALTER TABLE table1 
    ADD COLUMN col3 VARCHAR NOT NULL CONSTRAINT uniq_col3 UNIQUE NOT ENFORCED;
Copy

以下は、主キー制約を持つ親テーブルと、最初のテーブルの主キー制約と同じ列を指す外部キー制約を持つ別のテーブルを作成します。

CREATE TABLE table2 (
    col1 INTEGER NOT NULL,
    col2 INTEGER NOT NULL,
    CONSTRAINT pkey_1 PRIMARY KEY (col1, col2) NOT ENFORCED
    );
CREATE TABLE table3 (
    col_a INTEGER NOT NULL,
    col_b INTEGER NOT NULL,
    CONSTRAINT fkey_1 FOREIGN KEY (col_a, col_b) REFERENCES table2 (col1, col2) NOT ENFORCED
    );
Copy