指定身份列

本文档介绍如何创建和使用身份列(有时 称为 自动递增列),这些列用于在表中创建和 维护表中的主键。当您向具有身份列的表中插入行时,BigQuery 会为该列生成唯一的整数值。

概览

身份列是一种 INT64 列,其中填充了由系统生成的唯一值。

身份列的主要用例是生成 主键。您还可以使用 主键,方法是使用 GENERATE_UUID函数 生成唯一字符串, 但通常首选身份列,原因如下:

  • 整数值比字符串值所需的存储空间更少。
  • 使用整数进行表联接比使用字符串更高效。

身份列的值是根据定义第一个值的起始值和定义连续生成的值之间的最小差值的递增值生成的。

生成的身份列值具有以下属性:

  • 唯一 。自动生成的值在表中是唯一的。
  • 松散排序 。生成的数值不保证严格按升序或降序排列。
  • 稀疏 。生成的数值不保证是连续的。某些值可能会被跳过,但身份列中的值始终相差您指定的递增值的倍数。

限制

  • 一个表最多只能有一个身份列。
  • 您可以使用旧版 SQL 从具有身份列的表中读取数据,但无法使用旧版 SQL 将数据写入到具有身份列的表中。
  • 您无法在身份列上使用聚簇或分区。
  • 如果源表或目标表具有身份列,则不支持以下表复制操作:

    • 使用 WRITE_APPENDWRITE_TRUNCATE 写入处置的表复制
    • 多源表复制
  • 对于具有身份列的表,不支持使用 Storage Write API (gRPC) 或 tabledata.insertAll API 方法 流式传输数据。

创建身份列

您可以在使用 CREATE TABLE DDL 语句创建新表时创建身份列。 使用 GENERATED AS IDENTITY 子句将 INT64 列指定为身份列。一个表最多只能有一个身份列。 您可以指定以下生成模式之一,以确定是否可以手动将值插入身份列:

  • GENERATED ALWAYS AS IDENTITY:值始终由系统生成。在此列中插入或更新数据时,您无法提供自己的值。 如果您未指定 ALWAYSBY DEFAULT,则系统会使用 ALWAYS

  • GENERATED BY DEFAULT AS IDENTITY:您可以在身份列中插入或修改值。BigQuery 不会强制您插入或修改的值具有唯一性。

    如果您在插入数据时省略了列或提供了 NULL,BigQuery 会自动为您生成值。身份列不能包含 NULL 值。如果您想在 INSERTMERGEUPDATE 语句中使用生成的值,可以使用 DEFAULTNULL 关键字。

以下示例创建了表 mydataset.id_table,其中包含一个身份 列 id,该列从 0 开始,递增值为 5:

CREATE TABLE mydataset.id_table (
  id INT64 GENERATED ALWAYS AS IDENTITY(START WITH 0 INCREMENT BY 5