TABLE_CONSTRAINTS ビュー

TABLE_CONSTRAINTS ビューには、BigQuery データセット内の主キーと外部キーの関係が含まれます。

一般的なリレーショナル データベースでは、主キーと外部キーを使用してデータの整合性が確保されます。主キーの値は行ごとに一意であり、NULL ではありません。行内の各外部キー値は、主キーテーブルの主キー列に存在しているか、NULL である必要があります。主キーと外部キーの関係は、DDL ステートメントを使用して作成、管理されます。

制限事項

  • 主キーと外部キーの値の制約は適用されません。ユーザーは、値が該当する制約に一致することを確認する必要があります。そうでないと、誤った結果が生じる可能性があります。詳細は以下のとおりです。
    • 主キーには一意の値が必要です。
    • 主キーは 16 列を超えてはなりません。
    • 外部キーには、主キーテーブルの列に存在する値が必要です。これらの値は NULL にすることもできます。
    • 主キーと外部キーは、BIGNUMERICBOOLEANDATEDATETIMEINT64NUMERICSTRINGTIMESTAMP のいずれかの型にする必要があります。
  • 主キーと外部キーは最上位の列にのみ設定できます。
  • 主キーに名前を付けることはできません。
  • 主キーの制約があるテーブルの名前は変更できません。
  • 主キーと外部キーの関係があるテーブルは同じデータセット内に存在する必要があります。
  • テーブルには、そのテーブルで定義された最大 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 ビューのスキーマは次のとおりです。

列名 意味

CONSTRAINT_CATALOG

STRING

制約プロジェクト名。

CONSTRAINT_SCHEMA

STRING

制約データセット名。

CONSTRAINT_NAME

STRING

制約名。

TABLE_CATALOG

STRING

制約付きテーブルのプロジェクト名。

TABLE_SCHEMA

STRING

制約付きテーブルのデータセット名。

TABLE_NAME

STRING

制約付きテーブルの名前。

CONSTRAINT_TYPE

STRING

PRIMARY KEYFOREIGN KEY のいずれか。

IS_DEFERRABLE

STRING

YES または NO(制約が延期可能かどうかによる)。NO のみがサポートされています。

INITIALLY_DEFERRED

STRING

NO のみがサポートされています。

ENFORCED

STRING

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 |
+-----------------------------+