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

YESNO,具体取决于限制条件是否可延期。仅支持 NO

INITIALLY_DEFERRED

STRING

仅支持 NO

ENFORCED

STRING

YESNO,具体取决于限制条件是否要强制执行。
仅支持 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:可选。您的 Cloud 项目的名称。如果未指定,则此命令会使用默认项目。
  • 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 |
+-----------------------------+