IDENTITY 列を指定する

このドキュメントでは、テーブルの主キーの作成と維持に使用される IDENTITY 列(自動インクリメント列とも呼ばれます)を作成して使用する方法について説明します。IDENTITY 列を持つテーブルに行を挿入すると、BigQuery はその列の一意の整数値を生成します。

概要

IDENTITY 列は、一意のシステム生成値が入力される INT64 列です。

IDENTITY 列の主な用途は、 主キーを生成することです。`GENERATE_UUID`関数を使用して一意の文字列を生成することで主キーを生成することもできますが、一般的に IDENTITY 列が推奨される理由は次のとおりです。GENERATE_UUID

  • 整数値は文字列値よりも必要なストレージ容量が少なくなります。
  • テーブル結合に文字列を使用するよりも整数を使用する方が効率的です。

IDENTITY 列の値は、最初の値を定義する開始値と、連続して生成される値の最小差を定義する増分値に基づいて生成されます。

生成された IDENTITY 列の値には次のプロパティがあります。

  • 一意 。自動生成された値はテーブル内で一意です。
  • 順序が緩い 。生成された値が厳密に昇順または降順になるとは限りません。
  • スパース 。生成された値が連続しているとは限りません。一部の値はスキップされる可能性がありますが、IDENTITY 列の値は常に指定した増分の倍数だけ異なります。

制限事項

  • 1 つのテーブルに設定できる IDENTITY 列は 1 つまでです。
  • レガシー SQL を使用して、IDENTITY 列を持つテーブルから読み取ることはできますが、レガシー SQL を使用して IDENTITY 列を持つテーブルに書き込むことはできません。
  • IDENTITY 列でクラスタリングまたはパーティショニングを使用することはできません。
  • ソーステーブルまたは宛先テーブルに IDENTITY 列がある場合、次のテーブル コピー オペレーションはサポートされません。

    • WRITE_APPEND または WRITE_TRUNCATE 書き込み処理を使用したテーブル コピー
    • 複数ソースのテーブル コピー
  • Storage Write API(gRPC)または tabledata.insertAll API メソッド を使用したデータのストリーミングは、IDENTITY 列を持つテーブルでは対象外です。

IDENTITY 列を作成する

IDENTITY 列は、 CREATE TABLE DDL ステートメントを使用して新しいテーブルを作成するときに作成できます。 GENERATED AS IDENTITY 句を使用して、INT64 列を IDENTITY 列として指定します。1 つのテーブルに設定できる IDENTITY 列は 1 つまでです。 IDENTITY 列に手動で値を挿入できるかどうかを決定する次のいずれかの生成モードを指定できます。

  • GENERATED ALWAYS AS IDENTITY: 値は常にシステムによって生成されます。この列にデータを挿入または更新するときに、独自の値を提供することはできません。 ALWAYS または BY DEFAULT を指定しない場合は、ALWAYS が使用されます。

  • GENERATED BY DEFAULT AS IDENTITY: IDENTITY 列に値を挿入または変更できます。BigQuery は、挿入または変更する値の一意性を強制しません。

    データを挿入するときに列を省略するか、NULL を指定すると、BigQuery は自動的に値を生成します。IDENTITY 列に NULL 値を含めることはできません。INSERTMERGEUPDATE ステートメントで生成された値を使用する場合は、DEFAULT または NULL キーワードを使用できます。

次の例では、0 から始まり 5 ずつ増分する IDENTITY 列 id を持つテーブル mydataset.id_table を作成します。

CREATE TABLE mydataset.id_table (
  id INT64 GENERATED ALWAYS AS IDENTITY(START WITH 0 INCREMENT BY 5),
  data STRING
);

IDENTITY 列のプロパティを列に追加する

既存の列を変更して IDENTITY 値を生成するには、