制約の概要¶
Snowflakeは、次の制約の機能を提供します。
一意キー、主キー、外部キー、列の NOT NULL 制約。
名前付き制約。
単一列および複数列の制約。
インラインおよびアウトラインの制約の作成。
制約の作成、変更、削除。
このトピックの内容:
サポートされている制約のタイプ¶
Snowflakeは、ANSI SQL標準で次の制約のタイプをサポートしています。
PRIMARY KEY
FOREIGN KEY
UNIQUE
NOT NULL
テーブルには複数の一意キーと外部キーを含めることができますが、主キーは1つしか含めることができません。PRIMARY KEY 制約は、列が NOT NULL と UNIQUE の両方であることを意味します。
すべての外部キーは、外部キーの各列の列タイプと一致する、対応する主キーまたは一意キーを参照する必要があります。外部キーの主キーは、外部キーとは異なるテーブル、または同じテーブルに存在できます。 ハイブリッドテーブル にまたがって外部キー制約を定義する場合、そのテーブルは同じデータベース内になければなりません。
次のテーブルは、制約の強制と制約が必要かどうかに関する、標準テーブルとハイブリッドテーブルの動作の違いをまとめたものです。
制約が 強制 されるのは、ある列が特定の方法で更新されないようにする場合です。例えば、 NOT NULL と宣言された列は、 NULL の値を含むことはできません。NOT NULL 列に NULL の値をコピーまたは挿入しようとすると、常にエラーになります。ハイブリッド・テーブルでは、 PRIMARY KEY 、 FOREIGN KEY 、 UNIQUE 制約に NOT ENFORCED プロパティを設定することはできません。このプロパティを設定すると、「無効な制約プロパティ」エラーが発生します。
制約は、テーブル内の1つ以上の列がそのような制約を持たなければならない場合に 必須 となります。これは、ハイブリッドテーブルの PRIMARY KEY 制約にのみ当てはまります。
機能 |
ハイブリッドテーブル |
標準テーブル |
---|---|---|
PRIMARY KEYの制約 |
必須、強制 |
オプション、強制ではない |
FOREIGN KEYの制約 |
オプション、参照整合性の強制 |
オプション、強制ではない |
UNIQUEの制約 |
オプション、強制 |
オプション、強制ではない |
NOT NULLの制約 |
オプション、強制 |
オプション、強制 |
CREATE | ALTER TABLE ... CONSTRAINT もご参照ください。
テーブルの制約¶
Snowflakeは永続テーブル、一時テーブル、仮テーブル、ハイブリッドテーブルの制約をサポートしています。すべてのデータ型の列に対して制約を定義でき、1つの制約に任意の数の列を含めることができます。
CREATE TABLE ... LIKE または CREATE TABLE ... CLONE を使用してテーブルをコピーする場合は、外部キーを含むすべての既存のテーブルの制約が新しいテーブルにコピーされます。(CREATE TABLE ... CLONE はハイブリッド・テーブルではサポートされていません)
DROP/UNDROPやGET_DDLなどの追加のコマンドと関数は、制約が含まれるテーブルでサポートされます。スキーマとデータベースでもサポートされます。
Snowflake Time Travelでは、Snowflakeはテーブルメタデータに旧バージョンの制約を保管しないため、テーブルの旧バージョンをコピーする場合はテーブルの現バージョンの制約が使用されます。
単一列制約と複数列制約¶
制約は、同じテーブルの単一の列または複数の列に定義できます。
複数列制約(複合主キーまたは一意キー)の場合、列は順序付けられ、各列には対応するキーシーケンスがあります。
インライン制約とアウトライン制約¶
制約は、テーブルの作成または変更時にインラインまたはアウトラインのいずれかで定義されます。
インライン制約は、列定義の一部として作成され、単一列制約にのみ使用できます。
アウトライン制約は、制約が作成される列を指定する別の句を使用して定義されます。これらは、単一列または複数列の制約の作成、および既存列の制約の作成のいずれかで使用できます。
GET_DDL の制約¶
GET_DDL が返す SQL ステートメントには、制約を定義する句が含まれていますが、次にご注意ください。
NOT NULL
やDEFAULT
などの単一列のみの制約は、列の定義に従ってインラインで再構築されます。一意/主/外部キーなどのテーブル制約は、単一の列で構成されている場合でも、常にアウトライン制約として再構築されます。
名前のない制約(つまり、システムが生成した名前を持つ制約)については、 GET_DDL はシステムが生成した名前を返しません。