テーブルを管理する

このドキュメントでは、BigQuery でテーブルを管理する方法について説明します。BigQuery のテーブルの管理タスクには以下のようなものがあります。

テーブル情報の取得、テーブルの一覧表示、テーブルデータへのアクセス制御など、テーブルの作成と使用の詳細については、テーブルの作成と使用をご覧ください。

始める前に

このドキュメントの各タスクを実行するために必要な権限をユーザーに与える Identity and Access Management(IAM)のロールを付与します。タスクの実行に必要な権限(存在する場合)は、タスクの「必要な権限」セクションに記載されています。

テーブルのプロパティを更新する

テーブルの次の要素を更新できます。

必要な権限

テーブルのプロパティの更新に必要な権限を取得するには、テーブルに対するデータ編集者roles/bigquery.dataEditor)IAM ロールの付与を管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

この事前定義ロールには、テーブルのプロパティの更新に必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

テーブルのプロパティを更新するには、次の権限が必要です。

  • bigquery.tables.update
  • bigquery.tables.get

これらの権限は、カスタムロールや他の事前定義ロールを使用して取得することもできます。

また、bigquery.datasets.create 権限がある場合は、作成したデータセットのテーブルのプロパティを更新できます。

テーブルの説明を更新する

テーブルの説明は次の方法で更新できます。

  • Google Cloud コンソールを使用する。
  • ALTER TABLE データ定義言語(DDL)ステートメントを使用する。
  • bq コマンドライン ツールの bq update コマンドを使用する。
  • tables.patch API メソッドを呼び出す。
  • クライアント ライブラリを使用する。

テーブルの説明を更新するには:

コンソール

Google Cloud コンソールを使用してテーブルを作成する場合、説明を追加することはできません。説明は、テーブルの作成後に [詳細] ページで追加できます。

  1. [エクスプローラ] パネルで、プロジェクトとデータセットを開いて、テーブルを選択します。

  2. 詳細パネルで、[詳細] をクリックします。

  3. [説明] セクションの鉛筆アイコンをクリックして、説明を編集します。

    説明の編集。

  4. ボックスに説明を入力し、[更新] をクリックして保存します。

SQL

ALTER TABLE SET OPTIONS ステートメントを使用します。次の例は、mytable という名前のテーブルの説明を更新します。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

    ALTER TABLE mydataset.mytable
      SET OPTIONS (
        description = 'Description of mytable');

  3. [実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

bq

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. --description フラグを指定して bq update コマンドを発行します。更新するテーブルがデフォルト プロジェクト以外のプロジェクトにある場合は、project_id:dataset の形式でプロジェクト ID をデータセット名に追加します。

    bq update \
    --description "description" \
    project_id:dataset.table

    次のように置き換えます。

    • description: テーブルの説明テキスト
    • project_id: プロジェクト ID
    • dataset: 更新するテーブルを含むデータセットの名前
    • table: 更新するテーブルの名前

    例:

    mydataset データセットの mytable テーブルの説明を「Description of mytable」に変更するには、次のコマンドを入力します。mydataset データセットはデフォルト プロジェクトにあります。

    bq update --description "Description of mytable" mydataset.mytable
    

    mydataset データセットの mytable テーブルの説明を「Description of mytable」に変更するには、次のコマンドを入力します。mydataset データセットは、デフォルト プロジェクトではなく myotherproject プロジェクトにあります。

    bq update \
    --description "Description of mytable" \
    myotherproject:mydataset.mytable
    

API

tables.patch メソッドを呼び出し、テーブル リソースdescription プロパティを使用して、テーブルの説明を更新します。tables.update メソッドはテーブル リソース全体を置き換えるため、tables.patch メソッドの方が適切です。

Go

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Go の設定手順を完了してください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// updateTableDescription demonstrates how to fetch a table's metadata and updates the Description metadata.
func updateTableDescription(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	tableRef := client.Dataset(datasetID).Table(tableID)
	meta, err := tableRef.Metadata(ctx)
	if err != nil {
		return err
	}
	update := bigquery.TableMetadataToUpdate{
		Description: "Updated description.",
	}
	if _, err = tableRef.Update(ctx, update, meta.ETag); err != nil {
		return err
	}
	return nil
}

Java

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Table;

public class UpdateTableDescription {

  public static void runUpdateTableDescription() {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    String newDescription = "this is the new table description";
    updateTableDescription(datasetName, tableName, newDescription);
  }

  public static void updateTableDescription(
      String datasetName, String tableName, String newDescription) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      Table table = bigquery.getTable(datasetName, tableName);
      bigquery.update(table.toBuilder().setDescription(newDescription).build());
      System.out.println("Table description updated successfully to " + newDescription);
    } catch (BigQueryException e) {
      System.out.println("Table description was not updated \n" + e.toString());
    }
  }
}

Python

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Python の設定手順を完了してください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

Table.description プロパティを構成し、Client.update_table() を呼び出して API に更新を送信します。
# from google.cloud import bigquery
# client = bigquery.Client()
# project = client.project
# dataset_ref = bigquery.DatasetReference(project, dataset_id)
# table_ref = dataset_ref.table('my_table')
# table = client.get_table(table_ref)  # API request

assert table.description == "Original description."
table.description = "Updated description."

table = client.update_table(table, ["description"])  # API request

assert table.description == "Updated description."

テーブルの有効期限を更新する

データセット レベルでデフォルトのテーブル有効期限を設定できます。また、テーブルの作成時にテーブルの有効期限を設定することもできます。テーブルの有効期限は有効期間(TTL)と呼ばれることもあります。

テーブルが期限切れになると、テーブル内のすべてのデータとともに、テーブルが削除されます。必要な場合は、データセットに指定されたタイムトラベル期間内に期限切れのテーブルの削除を取り消すことができます。詳細については、削除されたテーブルの復元をご覧ください。

テーブルの作成時に有効期限を設定した場合、データセットのデフォルトのテーブル有効期限は無視されます。データセット レベルでデフォルトのテーブル有効期限を設定せず、テーブルの作成時にもテーブル有効期限を設定しなかった場合、テーブルは無期限に有効になります。このようなテーブルは手動で削除する必要があります。

テーブルを作成した後、テーブルの有効期限を次の方法でいつでも更新できます。

  • Google Cloud コンソールを使用する。
  • ALTER TABLE データ定義言語(DDL)ステートメントを使用する。
  • bq コマンドライン ツールの bq update コマンドを使用する。
  • tables.patch API メソッドを呼び出す。
  • クライアント ライブラリを使用する。

テーブルの有効期限を更新するには:

コンソール

Google Cloud コンソールを使用してテーブルを作成するときに有効期限を追加することはできません。テーブルを作成した後、[テーブル詳細] ページでテーブルの有効期限を追加または更新できます。

  1. [エクスプローラ] パネルで、プロジェクトとデータセットを開いて、テーブルを選択します。

  2. 詳細パネルで、[詳細] をクリックします。

  3. [テーブル情報] の横にある鉛筆アイコンをクリックします。

  4. [テーブルの有効期限] で [日付を指定] を選択します。次に、カレンダー ウィジェットで有効期限を選択します。

  5. [更新] をクリックして保存します。更新された有効期限が [テーブル情報] セクションに表示されます。

SQL

ALTER TABLE SET OPTIONS ステートメントを使用します。次の例では、mytable という名前のテーブルの有効期限を更新します。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

    ALTER TABLE mydataset.mytable
      SET OPTIONS (
        -- Sets table expiration to timestamp 2025-02-03 12:34:56
        expiration_timestamp = TIMESTAMP '2025-02-03 12:34:56');

  3. [実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

bq

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. --expiration フラグを指定して bq update コマンドを発行します。更新するテーブルがデフォルト プロジェクト以外のプロジェクトにある場合は、project_id:dataset の形式でプロジェクト ID をデータセット名に追加します。

    bq update \
    --expiration integer \
    project_id:dataset.table

    次のように置き換えます。

    • integer: テーブルのデフォルトの存続期間(秒)です。最小値は 3,600 秒(1 時間)です。現在時刻にこの整数値を足した値が有効期限になります。0 を指定すると、テーブルの有効期限が削除され、テーブルは無期限に有効になります。有効期限のないテーブルは手動で削除する必要があります。
    • project_id: プロジェクト ID。
    • dataset: 更新するテーブルを含むデータセットの名前。
    • table: 更新するテーブルの名前。

    例:

    mydataset データセットの mytable テーブルの有効期限を 5 日(432,000 秒)に更新するには、次のコマンドを入力します。mydataset データセットはデフォルト プロジェクトにあります。

    bq update --expiration 432000 mydataset.mytable
    

    mydataset データセットの mytable テーブルの有効期限を 5 日(432,000 秒)に更新するには、次のコマンドを入力します。mydataset データセットは、デフォルト プロジェクトではなく myotherproject プロジェクトにあります。

    bq update --expiration 432000 myotherproject:mydataset.mytable
    

API

tables.patch メソッドを呼び出し、テーブル リソースexpirationTime プロパティを使用して、テーブルの有効期限(ミリ秒単位)を更新します。tables.update メソッドはテーブル リソース全体を置き換えるため、tables.patch メソッドの方が適切です。

Go

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Go の設定手順を完了してください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

import (
	"context"
	"fmt"
	"time"

	"cloud.google.com/go/bigquery"
)

// updateTableExpiration demonstrates setting the table expiration of a table to a specific point in time
// in the future, at which time it will be deleted.
func updateTableExpiration(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	tableRef := client.Dataset(datasetID).Table(tableID)
	meta, err := tableRef.Metadata(ctx)
	if err != nil {
		return err
	}
	update := bigquery.TableMetadataToUpdate{
		ExpirationTime: time.Now().Add(time.Duration(5*24) * time.Hour), // table expiration in 5 days.
	}
	if _, err = tableRef.Update(ctx, update, meta.ETag); err != nil {
		return err
	}
	return nil
}

Java

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Table;
import java.util.concurrent.TimeUnit;

public class UpdateTableExpiration {

  public static void runUpdateTableExpiration() {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    // Update table expiration to one day.
    Long newExpiration = TimeUnit.MILLISECONDS.convert(1, TimeUnit.DAYS);
    updateTableExpiration(datasetName, tableName, newExpiration);
  }

  public static void updateTableExpiration(
      String datasetName, String tableName, Long newExpiration) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      Table table = bigquery.getTable(datasetName, tableName);
      bigquery.update(table.toBuilder().setExpirationTime(newExpiration).build());

      System.out.println("Table expiration updated successfully to " + newExpiration);
    } catch (BigQueryException e) {
      System.out.println("Table expiration was not updated \n" + e.toString());
    }
  }
}

Node.js

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Node.js の設定手順を完了してください。詳細については、BigQuery Node.js API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function updateTableExpiration() {
  // Updates a table's expiration.

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = 'my_dataset', // Existing dataset
  // const tableId = 'my_table', // Existing table
  // const expirationTime = Date.now() + 1000 * 60 * 60 * 24 * 5 // 5 days from current time in ms

  // Retreive current table metadata
  const table = bigquery.dataset(datasetId).table(tableId);
  const [metadata] = await table.getMetadata();

  // Set new table expiration to 5 days from current time
  metadata.expirationTime = expirationTime.toString();
  const [apiResponse] = await table.setMetadata(metadata);

  const newExpirationTime = apiResponse.expirationTime;
  console.log(`${tableId} expiration: ${newExpirationTime}`);
}

Python

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Python の設定手順を完了してください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

Table.expires プロパティを構成し、Client.update_table() を呼び出して API に更新を送信します。
# Copyright 2022 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import datetime


def update_table_expiration(table_id, expiration):
    orig_table_id = table_id
    orig_expiration = expiration

    from google.cloud import bigquery

    client = bigquery.Client()

    # TODO(dev): Change table_id to the full name of the table you want to update.
    table_id = "your-project.your_dataset.your_table_name"

    # TODO(dev): Set table to expire for desired days days from now.
    expiration = datetime.datetime.now(datetime.timezone.utc) + datetime.timedelta(
        days=5
    )

    table_id = orig_table_id
    expiration = orig_expiration

    table = client.get_table(table_id)  # Make an API request.
    table.expires = expiration
    table = client.update_table(table, ["expires"])  # API request

    print(f"Updated {table_id}, expires {table.expires}.")

データセットのデフォルトのパーティション有効期限を更新するには:

Java

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.Dataset;
import java.util.concurrent.TimeUnit;

// Sample to update partition expiration on a dataset.
public class UpdateDatasetPartitionExpiration {

  public static void main(String[] args) {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    // Set the default partition expiration (applies to new tables, only) in
    // milliseconds. This example sets the default expiration to 90 days.
    Long newExpiration = TimeUnit.MILLISECONDS.convert(90, TimeUnit.DAYS);
    updateDatasetPartitionExpiration(datasetName, newExpiration);
  }

  public static void updateDatasetPartitionExpiration(String datasetName, Long newExpiration) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      Dataset dataset = bigquery.getDataset(datasetName);
      bigquery.update(dataset.toBuilder().setDefaultPartitionExpirationMs(newExpiration).build());
      System.out.println(
          "Dataset default partition expiration updated successfully to " + newExpiration);
    } catch (BigQueryException e) {
      System.out.println("Dataset partition expiration was not updated \n" + e.toString());
    }
  }
}

Python

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Python の設定手順を完了してください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

# Copyright 2019 Google LLC
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     https://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.


def update_dataset_default_partition_expiration(dataset_id: str) -> None:

    from google.cloud import bigquery

    # Construct a BigQuery client object.
    client = bigquery.Client()

    # TODO(developer): Set dataset_id to the ID of the dataset to fetch.
    # dataset_id = 'your-project.your_dataset'

    dataset = client.get_dataset(dataset_id)  # Make an API request.

    # Set the default partition expiration (applies to new tables, only) in
    # milliseconds. This example sets the default expiration to 90 days.
    dataset.default_partition_expiration_ms = 90 * 24 * 60 * 60 * 1000

    dataset = client.update_dataset(
        dataset, ["default_partition_expiration_ms"]
    )  # Make an API request.

    print(
        "Updated dataset {}.{} with new default partition expiration {}".format(
            dataset.project, dataset.dataset_id, dataset.default_partition_expiration_ms
        )
    )

テーブルの丸めモードを更新する

ALTER TABLE SET OPTIONS DDL ステートメントを使用して、テーブルのデフォルトの丸めモードを更新できます。次の例では、mytable のデフォルトの丸めモードを ROUND_HALF_EVEN に更新します。

ALTER TABLE mydataset.mytable
SET OPTIONS (
  default_rounding_mode = "ROUND_HALF_EVEN");

NUMERIC または BIGNUMERIC フィールドをテーブルに追加し、丸めモードを指定しないと、丸めモードは自動的にテーブルのデフォルトの丸めに設定されます。テーブルのデフォルトの丸めモードを変更しても、既存のフィールドの丸めモードは変更されません。

テーブルのスキーマ定義を更新する

テーブルのスキーマ定義の更新方法については、テーブル スキーマの変更をご覧ください。

テーブルの名前を変更する

テーブルを作成した後にテーブルの名前を変更するには、ALTER TABLE RENAME TO ステートメントを使用します。次の例では、mytable の名前を mynewtable に変更します。

ALTER TABLE mydataset.mytable
RENAME TO mynewtable;

テーブル名の変更に関する制限

  • データ ストリーミングを含むテーブルの名前を変更する場合は、ストリーミングを停止して、BigQuery がストリーミングを使用していないことを示すまで待つ必要があります。
  • 通常、テーブルの名前は最後のストリーミング オペレーションから 72 時間以内に変更されますが、それ以上かかる場合もあります。
  • 既存のテーブル ACL と行アクセス ポリシーは保持されますが、テーブル名の変更中に行われたテーブル ACL と行アクセス ポリシーの更新は保持されません。
  • テーブルの名前を変更して、そのテーブルで DML ステートメントを同時に実行することはできません。
  • テーブルの名前を変更すると、テーブルのすべての Data Catalog タグが削除されます。
  • 外部テーブルの名前は変更できません。

テーブルをコピーする

このセクションでは、テーブルの完全なコピーを作成する方法について説明します。他のタイプのテーブルのコピーについては、テーブル クローンテーブル スナップショットをご覧ください。

次の方法でテーブルをコピーできます。

  • Google Cloud コンソールを使用する。
  • bq cp コマンドを使用する。
  • CREATE TABLE COPY データ定義言語(DDL)ステートメントを送信する。
  • jobs.insert API メソッドを呼び出して、copy ジョブを構成する。
  • クライアント ライブラリを使用する。

テーブルのコピーに関する制限事項

テーブルのコピージョブには以下の制限があります。

  • テーブルをコピーするとき、コピー先テーブルの名前は、テーブルの作成時と同じ命名規則に従う必要があります。
  • テーブルのコピーは、コピージョブに関する BigQuery の上限が適用されます。
  • Google Cloud コンソールでは、一度に 1 つのテーブルのみをコピーできます。コピー先データセット内の既存のテーブルを上書きすることはできません。コピーするテーブルには、コピー先データセット内で一意の名前を付ける必要があります。
  • Google Cloud コンソールでは、複数のテーブルを 1 つのテーブルにコピーすることはできません。
  • API、bq コマンドライン ツール、またはクライアント ライブラリで複数のテーブルを 1 つのテーブルにコピーする場合は、すべてのコピー元テーブルで同一のスキーマ(パーティショニングやクラスタリングなど)が使用されている必要があります。

    列の削除や名前変更など、特定のテーブル スキーマの更新を行うと、テーブルのスキーマは同じに見えても、内部表現が変わっていることがあります。これにより、テーブルのコピージョブがエラー Maximum limit on diverging physical schemas reached で失敗する可能性があります。この場合、CREATE TABLE LIKE ステートメントを使用すると、ソーステーブルのスキーマを宛先テーブルのスキーマと完全に一致させることができます。

  • BigQuery では、基盤となるストレージが動的に管理されるため、テーブルのコピーにかかる時間が大きく異なる場合があります。

  • コピー元のテーブルよりも列数が多く、追加された列がデフォルト値を持つコピー先テーブルに、コピー元テーブルをコピーして追加することはできません。代わりに、INSERT destination_table SELECT * FROM source_table を実行してデータをコピーできます。

  • コピー オペレーションが既存のテーブルを上書きする場合は、既存のテーブルに対するテーブルレベルのアクセスが維持されます。ソーステーブルのタグは、上書きされるテーブルにコピーされません。

  • コピー オペレーションによって新しいテーブルが作成される場合、新しいテーブルに対するテーブルレベルのアクセス権は、新しいテーブルが作成されるデータセットのアクセス ポリシーによって決まります。さらに、ソーステーブルから新しいテーブルにタグがコピーされます。

  • 複数のコピー元テーブルを 1 つのコピー先テーブルにコピーする場合は、すべてのコピー元テーブルに同じタグを設定する必要があります。

必要なロール

このドキュメントのタスクを実行するには、次の権限が必要です。

テーブルとパーティションをコピーするロール

テーブルとパーティションのコピーに必要な権限を取得するには、コピー元データセットとコピー先データセットに対するデータ編集者roles/bigquery.dataEditor)IAM ロールの付与を管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

この事前定義ロールには、テーブルとパーティションのコピーに必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

テーブルとパーティションをコピーするには、次の権限が必要です。

  • ソース データセットとコピー先データセットに対する bigquery.tables.getData
  • ソース データセットとコピー先データセットに対する bigquery.tables.get
  • コピー先データセットに対する bigquery.tables.create
  • コピー先データセットに対する bigquery.tables.update

これらの権限は、カスタムロールや他の事前定義ロールを使用して取得することもできます。

コピージョブを実行する権限

コピージョブを実行するために必要な権限を取得するには、コピー元データセットとコピー先データセットに対するジョブユーザーroles/bigquery.jobUser)IAM ロールの付与を管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

この事前定義ロールには、コピージョブを実行するために必要な bigquery.jobs.create 権限が含まれています。

カスタムロールや他の事前定義ロールを使用して、この権限を取得することもできます。

単一ソースのテーブルをコピーする

次の方法で 1 つのテーブルをコピーできます。

  • Google Cloud コンソールを使用する。
  • bq コマンドライン ツールの bq cp コマンドを使用する。
  • CREATE TABLE COPY データ定義言語(DDL)ステートメントを使用する。
  • jobs.insert API メソッドを呼び出して、copy ジョブを構成し、sourceTable プロパティを指定する。
  • クライアント ライブラリを使用する。

Google Cloud コンソールと CREATE TABLE COPY ステートメントを使用する場合、コピージョブでサポートされるのは、コピー元テーブルとコピー先テーブル、それぞれ 1 つのみです。複数のファイルを 1 つのテーブルにコピーするには、bq コマンドライン ツールまたは API を使用する必要があります。

1 つのテーブルをコピーするには:

Console

  1. [エクスプローラ] パネルで、プロジェクトとデータセットを開いて、テーブルを選択します。

  2. 詳細パネルで [テーブルをコピー] をクリックします。

  3. [テーブルのコピー] ダイアログの [コピー先] で次の操作を行います。

    • [プロジェクト名] で、コピーしたテーブルを保存するプロジェクトを選択します。
    • [データセット名] で、コピーしたテーブルを保存するデータセットを選択します。コピー元データセットとコピー先データセットは同じロケーションに存在する必要があります。
    • [テーブル名] に新しいテーブルの名前を入力します。この名前はコピー先データセット内で一意である必要があります。Google Cloud コンソールを使用して、コピー先データセット内の既存のテーブルを上書きすることはできません。テーブル名の要件の詳細については、テーブルの命名をご覧ください。
  4. [コピー] をクリックして、コピージョブを開始します。

SQL

CREATE TABLE COPY ステートメントを使用して、table1 という名前のテーブルを table1copy という名前の新しいテーブルにコピーします。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

    CREATE TABLE myproject.mydataset.table1copy
    COPY myproject.mydataset.table1;

  3. [実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

bq

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. bq cp コマンドを発行します。オプションのフラグを使用して、コピー先テーブルの書き込み処理を制御できます。

    • -a または --append_table を指定すると、コピー元テーブルのデータがコピー先データセット内の既存のテーブルの末尾に追加されます。
    • -f または --force を指定すると、コピー先データセット内の既存のテーブルが上書きされます。確認を求めるプロンプトは表示されません。
    • -n または --no_clobber を指定すると、コピー先データセット内にテーブルが存在している場合に Table 'project_id:dataset.table' already exists, skipping. というエラー メッセージが返されます。-n を指定しなかった場合、デフォルトでは、コピー先テーブルを置き換えるかどうかを選択するプロンプトが表示されます。
    • --destination_kms_key には、顧客管理の Cloud KMS 鍵を指定します。これは、コピー先テーブルを暗号化する場合に使用します。

    --destination_kms_key はここでは説明しません。詳細については、Cloud Key Management Service 鍵によるデータの保護をご覧ください。

    コピー元またはコピー先のデータセットがデフォルト以外のプロジェクトにある場合は、project_id:dataset の形式でプロジェクト ID をデータセット名に追加します。

    (省略可)--location フラグを指定して、その値をロケーションに設定します。

    bq --location=location cp \
    -a -f -n \
    project_id:dataset.source_table \
    project_id:dataset.destination_table

    次のように置き換えます。

    • location: ロケーションの名前。--location フラグは省略可能です。たとえば、BigQuery を東京リージョンで使用している場合は、このフラグの値を asia-northeast1 に設定します。.bigqueryrc ファイルを使用してロケーションのデフォルト値を設定できます。
    • project_id: プロジェクト ID。
    • dataset: コピー元データセットまたはコピー先データセットの名前。
    • source_table: コピーするテーブル。
    • destination_table: 宛先データセット内のテーブル名。

    例:

    mydataset.mytable テーブルを mydataset2.mytable2 テーブルにコピーするには、次のコマンドを入力します。データセットは両方ともデフォルト プロジェクトにあります。

    bq cp mydataset.mytable mydataset2.mytable2
    

    mydataset.mytable テーブルをコピーして、同じ名前が付いたコピー先のテーブルを上書きするには、次のコマンドを入力します。コピー元データセットはデフォルト プロジェクトにあります。コピー先データセットは、myotherproject プロジェクトにあります。-f ショートカットが指定されているため、コピー先テーブルは確認プロンプトなしで上書きされます。

    bq cp -f \
    mydataset.mytable \
    myotherproject:myotherdataset.mytable

    mydataset.mytable テーブルのコピーで、コピー先データセットに同じ名前のテーブルがある場合にエラーを返すには、次のコマンドを入力します。コピー元データセットはデフォルト プロジェクトにあります。コピー先データセットは、myotherproject プロジェクトにあります。-n ショートカットが指定されているため、同じ名前のテーブルが上書きされることはありません。

    bq cp -n \
    mydataset.mytable \
    myotherproject:myotherdataset.mytable

    mydataset.mytable テーブルをコピーして、同じ名前が付いたコピー先のテーブルに追加するには、次のコマンドを入力します。コピー元データセットはデフォルト プロジェクトにあります。コピー先データセットは、myotherproject プロジェクトにあります。- a ショートカットが指定されているため、コピー先テーブルの末尾にデータが追加されます。

    bq cp -a mydataset.mytable myotherproject:myotherdataset.mytable
    

API

API を使用して既存のテーブルをコピーするには、bigquery.jobs.insert メソッドを呼び出し、copy ジョブを構成します。ジョブリソースjobReference セクションにある location プロパティでロケーションを指定します。

ジョブ構成で次の値を指定する必要があります。

"copy": {
      "sourceTable": {       // Required
        "projectId": string, // Required
        "datasetId": string, // Required
        "tableId": string    // Required
      },
      "destinationTable": {  // Required
        "projectId": string, // Required
        "datasetId": string, // Required
        "tableId": string    // Required
      },
      "createDisposition": string,  // Optional
      "writeDisposition": string,   // Optional
    },

sourceTable にはコピーするテーブルの情報、destinationTable には新しいテーブルの情報を指定します。createDisposition には同名のテーブルが存在しない場合に新しく作成するかどうか、writeDisposition には既存のテーブルを上書きするかデータを追加するかを指定します。

C#

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある C# の設定手順を完了してください。詳細については、BigQuery C# API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。


using Google.Apis.Bigquery.v2.Data;
using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryCopyTable
{
    public void CopyTable(
        string projectId = "your-project-id",
        string destinationDatasetId = "your_dataset_id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        TableReference sourceTableRef = new TableReference()
        {
            TableId = "shakespeare",
            DatasetId = "samples",
            ProjectId = "bigquery-public-data"
        };
        TableReference destinationTableRef = client.GetTableReference(
            destinationDatasetId, "destination_table");
        BigQueryJob job = client.CreateCopyJob(
            sourceTableRef, destinationTableRef)
            .PollUntilCompleted() // Wait for the job to complete.
            .ThrowOnAnyError();

        // Retrieve destination table
        BigQueryTable destinationTable = client.GetTable(destinationTableRef);
        Console.WriteLine(
            $"Copied {destinationTable.Resource.NumRows} rows from table "
            + $"{sourceTableRef.DatasetId}.{sourceTableRef.TableId} "
            + $"to {destinationTable.FullyQualifiedId}."
        );
    }
}

Go

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Go の設定手順を完了してください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// copyTable demonstrates copying a table from a source to a destination, and
// allowing the copy to overwrite existing data by using truncation.
func copyTable(projectID, datasetID, srcID, dstID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// srcID := "sourcetable"
	// dstID := "destinationtable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	dataset := client.Dataset(datasetID)
	copier := dataset.Table(dstID).CopierFrom(dataset.Table(srcID))
	copier.WriteDisposition = bigquery.WriteTruncate
	job, err := copier.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}
	if err := status.Err(); err != nil {
		return err
	}
	return nil
}

Java

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.CopyJobConfiguration;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.TableId;

public class CopyTable {

  public static void runCopyTable() {
    // TODO(developer): Replace these variables before running the sample.
    String destinationDatasetName = "MY_DESTINATION_DATASET_NAME";
    String destinationTableId = "MY_DESTINATION_TABLE_NAME";
    String sourceDatasetName = "MY_SOURCE_DATASET_NAME";
    String sourceTableId = "MY_SOURCE_TABLE_NAME";

    copyTable(sourceDatasetName, sourceTableId, destinationDatasetName, destinationTableId);
  }

  public static void copyTable(
      String sourceDatasetName,
      String sourceTableId,
      String destinationDatasetName,
      String destinationTableId) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId sourceTable = TableId.of(sourceDatasetName, sourceTableId);
      TableId destinationTable = TableId.of(destinationDatasetName, destinationTableId);

      // For more information on CopyJobConfiguration see:
      // https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/JobConfiguration.html
      CopyJobConfiguration configuration =
          CopyJobConfiguration.newBuilder(destinationTable, sourceTable).build();

      // For more information on Job see:
      // https://googleapis.dev/java/google-cloud-clients/latest/index.html?com/google/cloud/bigquery/package-summary.html
      Job job = bigquery.create(JobInfo.of(configuration));

      // Blocks until this job completes its execution, either failing or succeeding.
      Job completedJob = job.waitFor();
      if (completedJob == null) {
        System.out.println("Job not executed since it no longer exists.");
        return;
      } else if (completedJob.getStatus().getError() != null) {
        System.out.println(
            "BigQuery was unable to copy table due to an error: \n" + job.getStatus().getError());
        return;
      }
      System.out.println("Table copied successfully.");
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Table copying job was interrupted. \n" + e.toString());
    }
  }
}

Node.js

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Node.js の設定手順を完了してください。詳細については、BigQuery Node.js API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

// Import the Google Cloud client library and create a client
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function copyTable() {
  // Copies src_dataset:src_table to dest_dataset:dest_table.

  /**
   * TODO(developer): Uncomment the following lines before running the sample
   */
  // const srcDatasetId = "my_src_dataset";
  // const srcTableId = "my_src_table";
  // const destDatasetId = "my_dest_dataset";
  // const destTableId = "my_dest_table";

  // Copy the table contents into another table
  const [job] = await bigquery
    .dataset(srcDatasetId)
    .table(srcTableId)
    .copy(bigquery.dataset(destDatasetId).table(destTableId));

  console.log(`Job ${job.id} completed.`);

  // Check the job's status for errors
  const errors = job.status.errors;
  if (errors && errors.length > 0) {
    throw errors;
  }
}

PHP

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある PHP の設定手順を完了してください。詳細については、BigQuery PHP API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

use Google\Cloud\BigQuery\BigQueryClient;
use Google\Cloud\Core\ExponentialBackoff;

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $datasetId = 'The BigQuery dataset ID';
// $sourceTableId   = 'The BigQuery table ID to copy from';
// $destinationTableId = 'The BigQuery table ID to copy to';

$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$dataset = $bigQuery->dataset($datasetId);
$sourceTable = $dataset->table($sourceTableId);
$destinationTable = $dataset->table($destinationTableId);
$copyConfig = $sourceTable->copy($destinationTable);
$job = $sourceTable->runJob($copyConfig);

// poll the job until it is complete
$backoff = new ExponentialBackoff(10);
$backoff->execute(function () use ($job) {
    print('Waiting for job to complete' . PHP_EOL);
    $job->reload();
    if (!$job->isComplete()) {
        throw new Exception('Job has not yet completed', 500);
    }
});
// check if the job has errors
if (isset($job->info()['status']['errorResult'])) {
    $error = $job->info()['status']['errorResult']['message'];
    printf('Error running job: %s' . PHP_EOL, $error);
} else {
    print('Table copied successfully' . PHP_EOL);
}

Python

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Python の設定手順を完了してください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。


from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set source_table_id to the ID of the original table.
# source_table_id = "your-project.source_dataset.source_table"

# TODO(developer): Set destination_table_id to the ID of the destination table.
# destination_table_id = "your-project.destination_dataset.destination_table"

job = client.copy_table(source_table_id, destination_table_id)
job.result()  # Wait for the job to complete.

print("A copy of the table created.")

複数の元テーブルをコピーする

次の方法で、複数のテーブルを 1 つのテーブルにコピーできます。

  • bq コマンドライン ツールの bq cp コマンドを使用する。
  • jobs.insert メソッドを呼び出して、copy ジョブを構成し、sourceTables プロパティを指定する。
  • クライアント ライブラリを使用する。

すべてのコピー元テーブルのスキーマとタグが同一である必要があります。また、指定できるコピー先テーブルは 1 つだけです。

コピー元テーブルは、カンマ区切りのリストとして指定する必要があります。複数のコピー元テーブルをコピーする場合、ワイルドカードは使用できません。

複数の参照元テーブルをコピーするには、次の選択肢のいずれかを選択します。

bq

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. bq cp コマンドを発行し、複数のコピー元テーブルをカンマ区切りのリストとして指定します。オプションのフラグを使用して、コピー先テーブルの書き込み処理を制御できます。

    • -a または --append_table を指定すると、コピー元テーブルのデータがコピー先データセット内の既存のテーブルの末尾に追加されます。
    • -f または --force を指定すると、コピー先データセット内の既存のコピー先テーブルが上書きされます。確認を求めるプロンプトは表示されません。
    • -n または --no_clobber を指定すると、コピー先データセット内にテーブルが存在している場合に Table 'project_id:dataset.table' already exists, skipping. というエラー メッセージが返されます。-n を指定しなかった場合、デフォルトでは、コピー先テーブルを置き換えるかどうかを選択するプロンプトが表示されます。
    • --destination_kms_key には、顧客管理の Cloud Key Management Service 鍵を指定します。これは、コピー先テーブルを暗号化する場合に使用します。

    --destination_kms_key はここでは説明しません。詳細については、Cloud Key Management Service 鍵によるデータの保護をご覧ください。

    コピー元またはコピー先のデータセットがデフォルト以外のプロジェクトにある場合は、project_id:dataset の形式でプロジェクト ID をデータセット名に追加します。

    (省略可)--location フラグを指定して、その値をロケーションに設定します。

    bq --location=location cp \
    -a -f -n \
    project_id:dataset.source_table,project_id:dataset.source_table \
    project_id:dataset.destination_table

    次のように置き換えます。

    • location: ロケーションの名前。--location フラグは省略可能です。たとえば、BigQuery を東京リージョンで使用している場合は、このフラグの値を asia-northeast1 に設定します。.bigqueryrc ファイルを使用してロケーションのデフォルト値を設定できます。
    • project_id: プロジェクト ID。
    • dataset: コピー元データセットまたはコピー先データセットの名前。
    • source_table: コピー元のテーブル。
    • destination_table: 宛先データセット内のテーブル名。

    例:

    mydataset.mytable テーブルと mydataset.mytable2 テーブルを mydataset2.tablecopy テーブルにコピーするには、次のコマンドを入力します。データセットはすべてデフォルト プロジェクトにあります。

    bq cp \
    mydataset.mytable,mydataset.mytable2 \
    mydataset2.tablecopy

    mydataset.mytable テーブルと mydataset.mytable2 テーブルを myotherdataset.mytable テーブルにコピーして、同じ名前が付いたコピー先のテーブルを上書きするには、次のコマンドを入力します。コピー先データセットは、デフォルト プロジェクトではなく myotherproject プロジェクトにあります。-f ショートカットが指定されているため、コピー先テーブルは確認プロンプトなしで上書きされます。

    bq cp -f \
    mydataset.mytable,mydataset.mytable2 \
    myotherproject:myotherdataset.mytable

    myproject:mydataset.mytable テーブルと myproject:mydataset.mytable2 テーブルのコピーで、コピー先データセットに同じ名前のテーブルがある場合にエラーを返すには、次のコマンドを入力します。コピー先データセットは、myotherproject プロジェクトにあります。-n ショートカットが指定されているため、同じ名前のテーブルが上書きされることはありません。

    bq cp -n \
    myproject:mydataset.mytable,myproject:mydataset.mytable2 \
    myotherproject:myotherdataset.mytable

    mydataset.mytable テーブルと mydataset.mytable2 テーブルをコピーして、同じ名前が付いたコピー先のテーブルに追加するには、次のコマンドを入力します。コピー元データセットはデフォルト プロジェクトにあります。コピー先データセットは、myotherproject プロジェクトにあります。-a ショートカットが指定されているため、コピー先テーブルの末尾にデータが追加されます。

    bq cp -a \
    mydataset.mytable,mydataset.mytable2 \
    myotherproject:myotherdataset.mytable

API

API を使用して複数のテーブルをコピーするには、jobs.insert メソッドを呼び出して copy ジョブを構成し、sourceTables プロパティを指定します。

ジョブリソースjobReference セクションにある location プロパティでリージョンを指定します。

Go

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Go の設定手順を完了してください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// copyMultiTable demonstrates using a copy job to copy multiple source tables into a single destination table.
func copyMultiTable(projectID, srcDatasetID string, srcTableIDs []string, dstDatasetID, dstTableID string) error {
	// projectID := "my-project-id"
	// srcDatasetID := "sourcedataset"
	// srcTableIDs := []string{"table1","table2"}
	// dstDatasetID = "destinationdataset"
	// dstTableID = "destinationtable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	srcDataset := client.Dataset(srcDatasetID)
	dstDataset := client.Dataset(dstDatasetID)
	var tableRefs []*bigquery.Table
	for _, v := range srcTableIDs {
		tableRefs = append(tableRefs, srcDataset.Table(v))
	}
	copier := dstDataset.Table(dstTableID).CopierFrom(tableRefs...)
	copier.WriteDisposition = bigquery.WriteTruncate
	job, err := copier.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}
	if err := status.Err(); err != nil {
		return err
	}
	return nil
}

Java

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.CopyJobConfiguration;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.TableId;
import java.util.Arrays;

public class CopyMultipleTables {

  public static void runCopyMultipleTables() {
    // TODO(developer): Replace these variables before running the sample.
    String destinationDatasetName = "MY_DATASET_NAME";
    String destinationTableId = "MY_TABLE_NAME";
    copyMultipleTables(destinationDatasetName, destinationTableId);
  }

  public static void copyMultipleTables(String destinationDatasetName, String destinationTableId) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId destinationTable = TableId.of(destinationDatasetName, destinationTableId);

      // For more information on CopyJobConfiguration see:
      // https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/JobConfiguration.html
      CopyJobConfiguration configuration =
          CopyJobConfiguration.newBuilder(
                  destinationTable,
                  Arrays.asList(
                      TableId.of(destinationDatasetName, "table1"),
                      TableId.of(destinationDatasetName, "table2")))
              .build();

      // For more information on Job see:
      // https://googleapis.dev/java/google-cloud-clients/latest/index.html?com/google/cloud/bigquery/package-summary.html
      Job job = bigquery.create(JobInfo.of(configuration));

      // Blocks until this job completes its execution, either failing or succeeding.
      Job completedJob = job.waitFor();
      if (completedJob == null) {
        System.out.println("Job not executed since it no longer exists.");
        return;
      } else if (completedJob.getStatus().getError() != null) {
        System.out.println(
            "BigQuery was unable to copy tables due to an error: \n" + job.getStatus().getError());
        return;
      }
      System.out.println("Table copied successfully.");
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Table copying job was interrupted. \n" + e.toString());
    }
  }
}

Node.js

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Node.js の設定手順を完了してください。詳細については、BigQuery Node.js API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function copyTableMultipleSource() {
  // Copy multiple source tables to a given destination.

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = "my_dataset";
  // sourceTable = 'my_table';
  // destinationTable = 'testing';

  // Create a client
  const dataset = bigquery.dataset(datasetId);

  const metadata = {
    createDisposition: 'CREATE_NEVER',
    writeDisposition: 'WRITE_TRUNCATE',
  };

  // Create table references
  const table = dataset.table(sourceTable);
  const yourTable = dataset.table(destinationTable);

  // Copy table
  const [apiResponse] = await table.copy(yourTable, metadata);
  console.log(apiResponse.configuration.copy);
}

Python

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Python の設定手順を完了してください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。


from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set dest_table_id to the ID of the destination table.
# dest_table_id = "your-project.your_dataset.your_table_name"

# TODO(developer): Set table_ids to the list of the IDs of the original tables.
# table_ids = ["your-project.your_dataset.your_table_name", ...]

job = client.copy_table(table_ids, dest_table_id)  # Make an API request.
job.result()  # Wait for the job to complete.

print("The tables {} have been appended to {}".format(table_ids, dest_table_id))

リージョン間でのテーブルのコピー

テーブル、テーブル スナップショット、またはテーブル クローンを、1 つの BigQuery リージョンまたはマルチリージョンからコピーできます。これには、顧客管理の Cloud KMS(CMEK)が適用されたテーブルが含まれます。これを行うと、BigQuery の料金に従って追加料金が発生します。

リージョン間でテーブルをコピーするには、次のいずれかのオプションを選択します。

bq

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. bq cp コマンドを実行します。

   bq cp \
   -f -n \
   SOURCE_PROJECT:SOURCE_DATASET.SOURCE_TABLE \
   DESTINATION_PROJECT:DESTINATION_DATASET.DESTINATION_TABLE
   

次のように置き換えます。

  • SOURCE_PROJECT: ソース プロジェクト ID。ソース データセットがデフォルト プロジェクト以外のプロジェクトにある場合は、ソース データセット名にプロジェクト ID を追加します。

  • DESTINATION_PROJECT: 宛先プロジェクト IDコピー先のデータセットがデフォルト プロジェクト以外のプロジェクトにある場合は、コピー先のデータセット名にプロジェクト ID を追加します。

  • SOURCE_DATASET: ソース データセットの名前。

  • DESTINATION_DATASET: コピー先データセットの名前。

  • SOURCE_TABLE: コピーするテーブル。

  • DESTINATION_TABLE: コピー先データセット内のテーブル名。

    例:

    mydataset_us.mytable テーブルを us マルチリージョンから eu マルチリージョンの mydataset_eu.mytable2 テーブルにコピーするには、次のコマンドを入力します。データセットは両方ともデフォルト プロジェクトにあります。

    bq cp --sync=false mydataset_us.mytable mydataset_eu.mytable2
    

    CMEK を有効化したテーブルをコピーするには、Cloud KMS を使用して鍵を作成し、bq cp コマンドにその鍵を指定するか、デフォルトの CMEK が構成されているコピー先データセットを使用します。次の例では、bq cp コマンドにコピー先の CMEK を指定します。

    bq cp --destination_kms_key=projects/testing/locations/us/keyRings/us_key/cryptoKeys/eu_key mydataset_us.mytable mydataset_eu.mytable2
    

API

API を使用してリージョン間でテーブルをコピーするには、jobs.insert メソッドを呼び出して、テーブルの copy ジョブを構成します。

ジョブリソースjobReference セクションにある location プロパティでリージョンを指定します。

C#

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある C# の設定手順を完了してください。詳細については、BigQuery C# API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。


using Google.Apis.Bigquery.v2.Data;
using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryCopyTable
{
    public void CopyTable(
        string projectId = "your-project-id",
        string destinationDatasetId = "your_dataset_id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        TableReference sourceTableRef = new TableReference()
        {
            TableId = "shakespeare",
            DatasetId = "samples",
            ProjectId = "bigquery-public-data"
        };
        TableReference destinationTableRef = client.GetTableReference(
            destinationDatasetId, "destination_table");
        BigQueryJob job = client.CreateCopyJob(
            sourceTableRef, destinationTableRef)
            .PollUntilCompleted() // Wait for the job to complete.
            .ThrowOnAnyError();

        // Retrieve destination table
        BigQueryTable destinationTable = client.GetTable(destinationTableRef);
        Console.WriteLine(
            $"Copied {destinationTable.Resource.NumRows} rows from table "
            + $"{sourceTableRef.DatasetId}.{sourceTableRef.TableId} "
            + $"to {destinationTable.FullyQualifiedId}."
        );
    }
}

Go

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Go の設定手順を完了してください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// copyTable demonstrates copying a table from a source to a destination, and
// allowing the copy to overwrite existing data by using truncation.
func copyTable(projectID, datasetID, srcID, dstID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// srcID := "sourcetable"
	// dstID := "destinationtable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	dataset := client.Dataset(datasetID)
	copier := dataset.Table(dstID).CopierFrom(dataset.Table(srcID))
	copier.WriteDisposition = bigquery.WriteTruncate
	job, err := copier.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}
	if err := status.Err(); err != nil {
		return err
	}
	return nil
}

Java

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.CopyJobConfiguration;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.TableId;

public class CopyTable {

  public static void runCopyTable() {
    // TODO(developer): Replace these variables before running the sample.
    String destinationDatasetName = "MY_DESTINATION_DATASET_NAME";
    String destinationTableId = "MY_DESTINATION_TABLE_NAME";
    String sourceDatasetName = "MY_SOURCE_DATASET_NAME";
    String sourceTableId = "MY_SOURCE_TABLE_NAME";

    copyTable(sourceDatasetName, sourceTableId, destinationDatasetName, destinationTableId);
  }

  public static void copyTable(
      String sourceDatasetName,
      String sourceTableId,
      String destinationDatasetName,
      String destinationTableId) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      TableId sourceTable = TableId.of(sourceDatasetName, sourceTableId);
      TableId destinationTable = TableId.of(destinationDatasetName, destinationTableId);

      // For more information on CopyJobConfiguration see:
      // https://googleapis.dev/java/google-cloud-clients/latest/com/google/cloud/bigquery/JobConfiguration.html
      CopyJobConfiguration configuration =
          CopyJobConfiguration.newBuilder(destinationTable, sourceTable).build();

      // For more information on Job see:
      // https://googleapis.dev/java/google-cloud-clients/latest/index.html?com/google/cloud/bigquery/package-summary.html
      Job job = bigquery.create(JobInfo.of(configuration));

      // Blocks until this job completes its execution, either failing or succeeding.
      Job completedJob = job.waitFor();
      if (completedJob == null) {
        System.out.println("Job not executed since it no longer exists.");
        return;
      } else if (completedJob.getStatus().getError() != null) {
        System.out.println(
            "BigQuery was unable to copy table due to an error: \n" + job.getStatus().getError());
        return;
      }
      System.out.println("Table copied successfully.");
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Table copying job was interrupted. \n" + e.toString());
    }
  }
}

Node.js

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Node.js の設定手順を完了してください。詳細については、BigQuery Node.js API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

// Import the Google Cloud client library and create a client
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function copyTable() {
  // Copies src_dataset:src_table to dest_dataset:dest_table.

  /**
   * TODO(developer): Uncomment the following lines before running the sample
   */
  // const srcDatasetId = "my_src_dataset";
  // const srcTableId = "my_src_table";
  // const destDatasetId = "my_dest_dataset";
  // const destTableId = "my_dest_table";

  // Copy the table contents into another table
  const [job] = await bigquery
    .dataset(srcDatasetId)
    .table(srcTableId)
    .copy(bigquery.dataset(destDatasetId).table(destTableId));

  console.log(`Job ${job.id} completed.`);

  // Check the job's status for errors
  const errors = job.status.errors;
  if (errors && errors.length > 0) {
    throw errors;
  }
}

PHP

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある PHP の設定手順を完了してください。詳細については、BigQuery PHP API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

use Google\Cloud\BigQuery\BigQueryClient;
use Google\Cloud\Core\ExponentialBackoff;

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $datasetId = 'The BigQuery dataset ID';
// $sourceTableId   = 'The BigQuery table ID to copy from';
// $destinationTableId = 'The BigQuery table ID to copy to';

$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$dataset = $bigQuery->dataset($datasetId);
$sourceTable = $dataset->table($sourceTableId);
$destinationTable = $dataset->table($destinationTableId);
$copyConfig = $sourceTable->copy($destinationTable);
$job = $sourceTable->runJob($copyConfig);

// poll the job until it is complete
$backoff = new ExponentialBackoff(10);
$backoff->execute(function () use ($job) {
    print('Waiting for job to complete' . PHP_EOL);
    $job->reload();
    if (!$job->isComplete()) {
        throw new Exception('Job has not yet completed', 500);
    }
});
// check if the job has errors
if (isset($job->info()['status']['errorResult'])) {
    $error = $job->info()['status']['errorResult']['message'];
    printf('Error running job: %s' . PHP_EOL, $error);
} else {
    print('Table copied successfully' . PHP_EOL);
}

Python

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Python の設定手順を完了してください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。


from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set source_table_id to the ID of the original table.
# source_table_id = "your-project.source_dataset.source_table"

# TODO(developer): Set destination_table_id to the ID of the destination table.
# destination_table_id = "your-project.destination_dataset.destination_table"

job = client.copy_table(source_table_id, destination_table_id)
job.result()  # Wait for the job to complete.

print("A copy of the table created.")

制限事項

リージョン間でテーブルをコピーする場合は、次の制限があります。

  • Google Cloud コンソールまたは TABLE COPY DDL ステートメントを使用してテーブルをコピーすることはできません。
  • コピー元のテーブルにポリシータグがある場合は、テーブルをコピーできません。
  • テーブルに関連付けられている IAM ポリシーはコピーできません。コピーが完了したら、同じポリシーをコピー先に適用できます。
  • 複数のテーブルを 1 つのテーブルにコピーすることはできません。
  • 追加モードではテーブルをコピーできません。
  • タイムトラベル情報は、コピー先のリージョンにコピーされません。
  • テーブル クローンは、コピー先のリージョンで完全コピーに変換されます。

現在の割り当て使用量を表示する

クエリ、読み込み、抽出、コピージョブの現在の使用状況を確認するには、INFORMATION_SCHEMA クエリを実行して、指定した期間に実行されたジョブに関するメタデータを表示します。現在の使用量と割り当て上限を比較することで、特定の種類のジョブの割り当て使用量を確認できます。次のクエリの例では、INFORMATION_SCHEMA.JOBS ビューを使用して、プロジェクトごとにクエリ、読み込み、抽出、コピーの各ジョブの数の一覧を表示します。

SELECT
  sum(case  when job_type="QUERY" then 1 else 0 end) as QRY_CNT,
  sum(case  when job_type="LOAD" then 1 else 0 end) as LOAD_CNT,
  sum(case  when job_type="EXTRACT" then 1 else 0 end) as EXT_CNT,
  sum(case  when job_type="COPY" then 1 else 0 end) as CPY_CNT
FROM `region-eu`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE date(creation_time)= CURRENT_DATE()

コピージョブの割り当て上限を表示するには、割り当てと上限 - コピージョブをご覧ください。

テーブルを削除する

テーブルは次の方法で削除できます。

  • Google Cloud コンソールを使用する。
  • DROP TABLE データ定義言語(DDL)ステートメントを使用する。
  • bq コマンドライン ツールの bq rm コマンドを使用する。
  • tables.delete API メソッドを呼び出す。
  • クライアント ライブラリを使用する。

データセット内のすべてのテーブルを削除するには、データセットを削除します。

テーブルを削除すると、そのテーブルに含まれるデータも削除されます。指定した期間の経過後にテーブルを自動的に削除するには、データセットのデフォルトのテーブル有効期限を設定するか、テーブルの作成時に有効期限を設定します。

テーブルを削除すると、このテーブルに関連付けられている権限も削除されます。削除されたテーブルを再作成する場合は、以前にそのテーブルに関連付けられていたアクセス権限を手動で再構成する必要があります。

必要なロール

テーブルを削除するために必要な権限を取得するには、データセットに対するデータ編集者roles/bigquery.dataEditor)IAM ロールの付与を管理者に依頼してください。ロールの付与については、プロジェクト、フォルダ、組織へのアクセス権の管理をご覧ください。

この事前定義ロールには、テーブルの削除に必要な権限が含まれています。必要とされる正確な権限については、「必要な権限」セクションを開いてご確認ください。

必要な権限

テーブルを削除するには、次の権限が必要です。

  • bigquery.tables.delete
  • bigquery.tables.get

これらの権限は、カスタムロールや他の事前定義ロールを使用して取得することもできます。

テーブルを削除する

テーブルを削除するには:

Console

  1. [エクスプローラ] パネルで、プロジェクトとデータセットを開いて、テーブルを選択します。

  2. 詳細パネルで [テーブルを削除] をクリックします。

  3. ダイアログに「"delete"」と入力し、[削除] をクリックして確定します。

SQL

DROP TABLE ステートメントを使用します。次の例では、mytable という名前のテーブルを削除します。

  1. Google Cloud コンソールで [BigQuery] ページに移動します。

    [BigQuery] に移動

  2. クエリエディタで次のステートメントを入力します。

    DROP TABLE mydataset.mytable;

  3. [実行] をクリックします。

クエリの実行方法については、インタラクティブ クエリを実行するをご覧ください。

bq

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. bq rm コマンドに --table フラグ(または -t ショートカット)を指定して実行して、テーブルを削除します。bq コマンドライン ツールを使用してテーブルを削除する場合、操作の確認を求められます。--forceフラグ(または -f ショートカット)を使用すると、確認をスキップできます。

    デフォルト以外のプロジェクトのデータセットにテーブルがある場合は、project_id:dataset の形式でプロジェクト ID をデータセット名に追加します。

    bq rm \
    -f \
    -t \
    project_id:dataset.table

    次のように置き換えます。

    • project_id: プロジェクト ID
    • dataset: テーブルを含むデータセットの名前
    • table: 削除するテーブルの名前

    例:

    mytable テーブルを mydataset データセットから削除するには、次のコマンドを入力します。mydataset データセットはデフォルト プロジェクトにあります。

    bq rm -t mydataset.mytable
    

    mytable テーブルを mydataset データセットから削除するには、次のコマンドを入力します。mydataset データセットは、デフォルト プロジェクトではなく myotherproject プロジェクトにあります。

    bq rm -t myotherproject:mydataset.mytable
    

    mytable テーブルを mydataset データセットから削除するには、次のコマンドを入力します。mydataset データセットはデフォルト プロジェクトにあります。このコマンドでは -f ショートカットを使用しているため、確認は省略されます。

    bq rm -f -t mydataset.mytable
    

API

tables.delete API メソッドを呼び出して、tableId パラメータを使用して削除するテーブルを指定します。

C#

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある C# の設定手順を完了してください。詳細については、BigQuery C# API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。


using Google.Cloud.BigQuery.V2;
using System;

public class BigQueryDeleteTable
{
    public void DeleteTable(
        string projectId = "your-project-id",
        string datasetId = "your_dataset_id",
        string tableId = "your_table_id"
    )
    {
        BigQueryClient client = BigQueryClient.Create(projectId);
        client.DeleteTable(datasetId, tableId);
        Console.WriteLine($"Table {tableId} deleted.");
    }
}

Go

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Go の設定手順を完了してください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

import (
	"context"
	"fmt"

	"cloud.google.com/go/bigquery"
)

// deleteTable demonstrates deletion of a BigQuery table.
func deleteTable(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	table := client.Dataset(datasetID).Table(tableID)
	if err := table.Delete(ctx); err != nil {
		return err
	}
	return nil
}

Java

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.TableId;

public class DeleteTable {

  public static void runDeleteTable() {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_NAME";
    deleteTable(datasetName, tableName);
  }

  public static void deleteTable(String datasetName, String tableName) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();
      boolean success = bigquery.delete(TableId.of(datasetName, tableName));
      if (success) {
        System.out.println("Table deleted successfully");
      } else {
        System.out.println("Table was not found");
      }
    } catch (BigQueryException e) {
      System.out.println("Table was not deleted. \n" + e.toString());
    }
  }
}

Node.js

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Node.js の設定手順を完了してください。詳細については、BigQuery Node.js API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function deleteTable() {
  // Deletes "my_table" from "my_dataset".

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = "my_dataset";
  // const tableId = "my_table";

  // Delete the table
  await bigquery
    .dataset(datasetId)
    .table(tableId)
    .delete();

  console.log(`Table ${tableId} deleted.`);
}

PHP

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある PHP の設定手順を完了してください。詳細については、BigQuery PHP API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

use Google\Cloud\BigQuery\BigQueryClient;

/** Uncomment and populate these variables in your code */
// $projectId = 'The Google project ID';
// $datasetId = 'The BigQuery dataset ID';
// $tableId = 'The BigQuery table ID';

$bigQuery = new BigQueryClient([
    'projectId' => $projectId,
]);
$dataset = $bigQuery->dataset($datasetId);
$table = $dataset->table($tableId);
$table->delete();
printf('Deleted table %s.%s' . PHP_EOL, $datasetId, $tableId);

Python

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Python の設定手順を完了してください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。


from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Set table_id to the ID of the table to fetch.
# table_id = 'your-project.your_dataset.your_table'

# If the table does not exist, delete_table raises
# google.api_core.exceptions.NotFound unless not_found_ok is True.
client.delete_table(table_id, not_found_ok=True)  # Make an API request.
print("Deleted table '{}'.".format(table_id))

Ruby

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Ruby の設定手順を完了してください。詳細については、BigQuery Ruby API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

require "google/cloud/bigquery"

def delete_table dataset_id = "my_dataset_id", table_id = "my_table_id"
  bigquery = Google::Cloud::Bigquery.new
  dataset  = bigquery.dataset dataset_id
  table    = dataset.table table_id

  table.delete

  puts "Table #{table_id} deleted."
end

削除されたテーブルを復元する

テーブルの削除は、データセットに指定されたタイムトラベル期間内であれば取り消すことができます。明示的な削除だけでなく、テーブルの有効期限による暗黙的な削除も取り消すことができます。ユーザーがタイムトラベル期間を構成することもできます。データセット全体の削除を取り消すには、データセットの削除を取り消すをご覧ください。

タイムトラベル期間の日数は、2~7 日に設定できます。タイムトラベル期間が経過した後は、サポート チケットのオープンを含めどのような方法を使用しても、テーブルの削除を取り消すことはできません。

過去のデータからテーブルを復元しても、元のテーブルのタグは復元したテーブルにコピーされません。

削除されたテーブルは、タイムトラベル期間内であれば、@<time> 時間デコレータを使用してテーブルを新しいテーブルにコピーすることで復元できます。テーブルをコピーするには、bq コマンドライン ツールかクライアント ライブラリを使用します。

コンソール

Google Cloud コンソールを使用してテーブルの削除を取り消すことはできません。

bq

  1. In the Google Cloud console, activate Cloud Shell.

    Activate Cloud Shell

    At the bottom of the Google Cloud console, a Cloud Shell session starts and displays a command-line prompt. Cloud Shell is a shell environment with the Google Cloud CLI already installed and with values already set for your current project. It can take a few seconds for the session to initialize.

  2. テーブルを復元するには、まずテーブルが存在していたときの UNIX タイムスタンプ(ミリ秒単位)を特定します。Linux の date コマンドを使用して、通常のタイムスタンプ値から Unix タイムスタンプを生成できます。

    date -d '2023-08-04 16:00:34.456789Z' +%s000
    
  3. 次に、@<time> タイムトラベル デコレータを指定して bq copy コマンドを使用し、テーブルのコピー オペレーションを実行します。

    たとえば、1418864998000 の時点の mydataset.mytable テーブルを新しいテーブル mydataset.newtable にコピーするには、次のコマンドを入力します。

    bq cp mydataset.mytable@1418864998000 mydataset.newtable
    

    (省略可)--location フラグを指定して、その値をロケーションに設定します。

    相対オフセットを指定することもできます。次の例は、1 時間前のテーブルのバージョンをコピーします。

    bq cp mydataset.mytable@-3600000 mydataset.newtable
    

    詳細については、特定の時点のテーブルを復元するをご覧ください。

Go

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Go の設定手順を完了してください。詳細については、BigQuery Go API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

import (
	"context"
	"fmt"
	"time"

	"cloud.google.com/go/bigquery"
)

// deleteAndUndeleteTable demonstrates how to recover a deleted table by copying it from a point in time
// that predates the deletion event.
func deleteAndUndeleteTable(projectID, datasetID, tableID string) error {
	// projectID := "my-project-id"
	// datasetID := "mydataset"
	// tableID := "mytable"
	ctx := context.Background()
	client, err := bigquery.NewClient(ctx, projectID)
	if err != nil {
		return fmt.Errorf("bigquery.NewClient: %v", err)
	}
	defer client.Close()

	ds := client.Dataset(datasetID)
	if _, err := ds.Table(tableID).Metadata(ctx); err != nil {
		return err
	}
	// Record the current time.  We'll use this as the snapshot time
	// for recovering the table.
	snapTime := time.Now()

	// "Accidentally" delete the table.
	if err := client.Dataset(datasetID).Table(tableID).Delete(ctx); err != nil {
		return err
	}

	// Construct the restore-from tableID using a snapshot decorator.
	snapshotTableID := fmt.Sprintf("%s@%d", tableID, snapTime.UnixNano()/1e6)
	// Choose a new table ID for the recovered table data.
	recoverTableID := fmt.Sprintf("%s_recovered", tableID)

	// Construct and run a copy job.
	copier := ds.Table(recoverTableID).CopierFrom(ds.Table(snapshotTableID))
	copier.WriteDisposition = bigquery.WriteTruncate
	job, err := copier.Run(ctx)
	if err != nil {
		return err
	}
	status, err := job.Wait(ctx)
	if err != nil {
		return err
	}
	if err := status.Err(); err != nil {
		return err
	}

	ds.Table(recoverTableID).Delete(ctx)
	return nil
}

Java

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Java の設定手順を完了してください。詳細については、BigQuery Java API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

import com.google.cloud.bigquery.BigQuery;
import com.google.cloud.bigquery.BigQueryException;
import com.google.cloud.bigquery.BigQueryOptions;
import com.google.cloud.bigquery.CopyJobConfiguration;
import com.google.cloud.bigquery.Job;
import com.google.cloud.bigquery.JobInfo;
import com.google.cloud.bigquery.TableId;

// Sample to undeleting a table
public class UndeleteTable {

  public static void runUndeleteTable() {
    // TODO(developer): Replace these variables before running the sample.
    String datasetName = "MY_DATASET_NAME";
    String tableName = "MY_TABLE_TABLE";
    String recoverTableName = "MY_RECOVER_TABLE_TABLE";
    undeleteTable(datasetName, tableName, recoverTableName);
  }

  public static void undeleteTable(String datasetName, String tableName, String recoverTableName) {
    try {
      // Initialize client that will be used to send requests. This client only needs to be created
      // once, and can be reused for multiple requests.
      BigQuery bigquery = BigQueryOptions.getDefaultInstance().getService();

      // "Accidentally" delete the table.
      bigquery.delete(TableId.of(datasetName, tableName));

      // Record the current time.  We'll use this as the snapshot time
      // for recovering the table.
      long snapTime = System.currentTimeMillis();

      // Construct the restore-from tableID using a snapshot decorator.
      String snapshotTableId = String.format("%s@%d", tableName, snapTime);

      // Construct and run a copy job.
      CopyJobConfiguration configuration =
          CopyJobConfiguration.newBuilder(
                  // Choose a new table ID for the recovered table data.
                  TableId.of(datasetName, recoverTableName),
                  TableId.of(datasetName, snapshotTableId))
              .build();

      Job job = bigquery.create(JobInfo.of(configuration));
      job = job.waitFor();
      if (job.isDone() && job.getStatus().getError() == null) {
        System.out.println("Undelete table recovered successfully.");
      } else {
        System.out.println(
            "BigQuery was unable to copy the table due to an error: \n"
                + job.getStatus().getError());
        return;
      }
    } catch (BigQueryException | InterruptedException e) {
      System.out.println("Table not found. \n" + e.toString());
    }
  }
}

Node.js

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Node.js の設定手順を完了してください。詳細については、BigQuery Node.js API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

// Import the Google Cloud client library
const {BigQuery} = require('@google-cloud/bigquery');
const bigquery = new BigQuery();

async function undeleteTable() {
  // Undeletes "my_table_to_undelete" from "my_dataset".

  /**
   * TODO(developer): Uncomment the following lines before running the sample.
   */
  // const datasetId = "my_dataset";
  // const tableId = "my_table_to_undelete";
  // const recoveredTableId = "my_recovered_table";

  /**
   * TODO(developer): Choose an appropriate snapshot point as epoch milliseconds.
   * For this example, we choose the current time as we're about to delete the
   * table immediately afterwards.
   */
  const snapshotEpoch = Date.now();

  // Delete the table
  await bigquery
    .dataset(datasetId)
    .table(tableId)
    .delete();

  console.log(`Table ${tableId} deleted.`);

  // Construct the restore-from table ID using a snapshot decorator.
  const snapshotTableId = `${tableId}@${snapshotEpoch}`;

  // Construct and run a copy job.
  await bigquery
    .dataset(datasetId)
    .table(snapshotTableId)
    .copy(bigquery.dataset(datasetId).table(recoveredTableId));

  console.log(
    `Copied data from deleted table ${tableId} to ${recoveredTableId}`
  );
}

Python

このサンプルを試す前に、クライアント ライブラリを使用した BigQuery クイックスタートにある Python の設定手順を完了してください。詳細については、BigQuery Python API のリファレンス ドキュメントをご覧ください。

BigQuery に対する認証を行うには、アプリケーションのデフォルト認証情報を設定します。詳細については、クライアント ライブラリの認証を設定するをご覧ください。

import time

from google.cloud import bigquery

# Construct a BigQuery client object.
client = bigquery.Client()

# TODO(developer): Choose a table to recover.
# table_id = "your-project.your_dataset.your_table"

# TODO(developer): Choose a new table ID for the recovered table data.
# recovered_table_id = "your-project.your_dataset.your_table_recovered"

# TODO(developer): Choose an appropriate snapshot point as epoch
# milliseconds. For this example, we choose the current time as we're about
# to delete the table immediately afterwards.
snapshot_epoch = int(time.time() * 1000)

# ...

# "Accidentally" delete the table.
client.delete_table(table_id)  # Make an API request.

# Construct the restore-from table ID using a snapshot decorator.
snapshot_table_id = "{}@{}".format(table_id, snapshot_epoch)

# Construct and run a copy job.
job = client.copy_table(
    snapshot_table_id,
    recovered_table_id,
    # Must match the source and destination tables location.
    location="US",
)  # Make an API request.

job.result()  # Wait for the job to complete.

print(
    "Copied data from deleted table {} to {}".format(table_id, recovered_table_id)
)

タイムトラベル期間によって許されたている期間後にテーブルを復元したくなることが想定される場合は、テーブルのスナップショットを作成します。 詳細については、テーブルのスナップショットをご覧ください。

テーブルのセキュリティ

BigQuery でテーブルへのアクセスを制御するには、テーブルのアクセス制御の概要をご覧ください。

次のステップ