TABLE_CONSTRAINTS ビュー
TABLE_CONSTRAINTS
ビューには、BigQuery データセット内の主キーと外部キーの関係が含まれます。
一般的なリレーショナル データベースでは、主キーと外部キーを使用してデータの整合性が確保されます。主キーの値は行ごとに一意であり、NULL
ではありません。行内の各外部キー値は、主キーテーブルの主キー列に存在しているか、NULL
である必要があります。主キーと外部キーの関係は、DDL ステートメントを使用して作成、管理されます。
制限事項
- 主キーと外部キーの値の制約は適用されません。ユーザーは、値が該当する制約に一致することを確認する必要があります。そうでないと、誤った結果が生じる可能性があります。詳細は以下のとおりです。
- 主キーには一意の値が必要です。
- 主キーは 16 列を超えてはなりません。
- 外部キーには、主キーテーブルの列に存在する値が必要です。これらの値は NULL にすることもできます。
- 主キーと外部キーは、
BIGNUMERIC
、BOOLEAN
、DATE
、DATETIME
、INT64
、NUMERIC
、STRING
、TIMESTAMP
のいずれかの型にする必要があります。
- 主キーと外部キーは最上位の列にのみ設定できます。
- 主キーに名前を付けることはできません。
- 主キーの制約があるテーブルの名前は変更できません。
- 主キーと外部キーの関係があるテーブルは同じデータセット内に存在する必要があります。
- テーブルには、そのテーブルで定義された最大 64 個の外部キーを含めることができます。
- 外部キーで同じテーブル内の列を参照することはできません。
RANGE
型では、主キーと外部キーはサポートされていません。- 主キー制約と外部キー制約の一部であるフィールドの名前を変更することや、型を変更することはできません。
-a
オプションまたは--append_table
オプションなしでテーブルのコピー、クローン作成、復元、またはスナップショットを行う場合、ソーステーブルの制約が宛先テーブルにコピーされて上書きされます。-a
オプションまたは--append_table
オプションを使用する場合、ソーステーブル レコードのみがテーブル制約なしで宛先テーブルに追加されます。
必要な権限
次の Identity and Access Management(IAM)権限が必要です。
bigquery.tables.get
: 主キーと外部キーの定義を表示します。bigquery.tables.list
: テーブル情報スキーマを表示します。
次の各事前定義ロールには、このドキュメントで説明するワークフローの実行に必要な権限があります。
roles/bigquery.dataEditor
roles/bigquery.dataOwner
roles/bigquery.admin
BigQuery での IAM のロールと権限について詳しくは、事前定義ロールと権限をご覧ください。
スキーマ
INFORMATION_SCHEMA.TABLE_CONSTRAINTS
ビューのスキーマは次のとおりです。
列名 | 型 | 意味 |
---|---|---|
|
|
制約プロジェクト名。 |
|
|
制約データセット名。 |
|
|
制約名。 |
|
|
制約付きテーブルのプロジェクト名。 |
|
|
制約付きテーブルのデータセット名。 |
|
|
制約付きテーブルの名前。 |
|
|
PRIMARY KEY 、FOREIGN KEY のいずれか。 |
|
|
YES または NO (制約が延期可能かどうかによる)。NO のみがサポートされています。 |
|
|
NO のみがサポートされています。 |
|
|
YES または NO (制約が適用されているかどうかによる)。NO のみがサポートされています。 |
スコープと構文
このビューに対するクエリでは、データセット修飾子を指定する必要があります。データセット修飾子が指定されたクエリの場合は、データセットに対する権限が必要です。詳細については、構文をご覧ください。次の表に、このビューのリージョン スコープとリソース スコープを示します。
ビュー名 | リソース スコープ | リージョン スコープ |
---|---|---|
[PROJECT_ID.]DATASET.INFORMATION_SCHEMA.TABLE_CONSTRAINTS; |
データセット レベル | データセットのロケーション |
- 省略可:
PROJECT_ID
: Google Cloud プロジェクトの ID。指定しない場合は、デフォルトのプロジェクトが使用されます。
例
次のクエリは、データセット内の単一テーブルの制約を示します。
SELECT * FROM PROJECT_ID.DATASET.INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE table_name = TABLE;
次のように置き換えます。
PROJECT_ID
: 省略可。クラウド プロジェクトの名前。指定しない場合、このコマンドではデフォルトのプロジェクトが使用されます。DATASET
: データセット名。TABLE
: テーブルの名前。
次のクエリは逆に、単一データセット内のすべてのテーブルの制約を示します。
SELECT * FROM PROJECT_ID.DATASET.INFORMATION_SCHEMA.TABLE_CONSTRAINTS;
既存の制約を使用すると、クエリ結果は次のようになります。
+-----+---------------------+-------------------+-----------------------+---------------------+--------------+------------+-----------------+---------------+--------------------+----------+ | Row | constraint_catalog | constraint_schema | constraint_name | table_catalog | table_schema | table_name | constraint_type | is_deferrable | initially_deferred | enforced | +-----+---------------------+-------------------+-----------------------+---------------------+--------------+------------+-----------------+---------------+--------------------+----------+ | 1 | myConstraintCatalog | myDataset | orders.pk$ | myConstraintCatalog | myDataset | orders | PRIMARY KEY | NO | NO | NO | | 2 | myConstraintCatalog | myDataset | orders.order_customer | myConstraintCatalog | myDataset | orders | FOREIGN KEY | NO | NO | NO | +-----+---------------------+-------------------+-----------------------+---------------------+--------------+------------+-----------------+---------------+--------------------+----------+
テーブルまたはデータセットに制約がない場合、クエリ結果は次のようになります。
+-----------------------------+ | There is no data to display | +-----------------------------+