管理資料表

這份文件說明如何在 BigQuery 中管理資料表。 您可透過下列方式管理 BigQuery 資料表:

如要瞭解如何還原 (或取消刪除) 已刪除的資料表,請參閱「還原已刪除的資料表」。

如要進一步瞭解如何建立及使用資料表,包括取得資料表資訊、列出資料表,以及控管資料表資料的存取權等,請參閱「建立及使用資料表」。

事前準備

授予身分與存取權管理 (IAM) 角色,讓使用者取得執行本文各項工作所需的權限。執行工作所需的權限 (如有) 會列在工作「必要權限」部分。

更新資料表屬性

您可以更新資料表的下列元素:

所需權限

如要取得更新資料表屬性所需的權限,請要求管理員授予資料表的資料編輯者 (roles/bigquery.dataEditor) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

這個預先定義的角色具備更新表格屬性所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:

所需權限

如要更新資料表屬性,必須具備下列權限:

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

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

此外,如果您具備 bigquery.datasets.create 權限,可以更新所建立資料集的資料表屬性。

更新資料表的說明

您可以透過下列方式更新資料表的說明:

  • 使用 Google Cloud 控制台。
  • 使用資料定義語言 (DDL) ALTER TABLE 陳述式。
  • 使用 bq 指令列工具的 bq update 指令。
  • 呼叫 tables.patch API 方法
  • 使用用戶端程式庫。
  • (預先發布版) 使用 資料洞察,透過 Gemini 生成說明。

如何更新資料表的說明:

主控台

使用Google Cloud 主控台建立資料表時,您無法新增說明。資料表建立完畢之後,您就可以在「Details」(詳細資料) 頁面中新增說明。

  1. 在「Explorer」面板中,展開專案和資料集,然後選取資料表。

  2. 在詳細資料面板中,按一下「詳細資料」

  3. 在「Description」(說明) 區段中,按一下鉛筆圖示來編輯說明。

    編輯說明。

  4. 在方塊中輸入說明,然後按一下 [Update] (更新) 即可儲存。

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 指令。如果您要更新非預設專案中的資料表,請使用下列格式將專案 ID 新增至資料集名稱:project_id:dataset

    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
    
  3. 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 控制台。
  • 使用資料定義語言 (DDL) ALTER TABLE 陳述式。
  • 使用 bq 指令列工具的 bq update 指令。
  • 呼叫 tables.patch API 方法
  • 使用用戶端程式庫。

如何更新資料表的到期時間:

主控台

使用Google Cloud 主控台建立資料表時,您無法新增到期時間。建立資料表後,您可以在「Table Details」(資料表詳細資料) 頁面上新增或更新資料表的到期時間。

  1. 在「Explorer」面板中,展開專案和資料集,然後選取資料表。

  2. 在詳細資料面板中,按一下「詳細資料」

  3. 按一下「Table info」(資料表資訊) 旁的鉛筆圖示。

  4. 針對「Table expiration」(資料表到期時間),選取 [Specify date] (指定日期)。然後使用日曆小工具選取到期日。

  5. 按一下 [Update] (更新) 即可儲存。已更新的到期時間會顯示在「Table info」(資料表資訊) 區段。

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 指令。如果您要更新非預設專案中的資料表,請使用下列格式將專案 ID 新增至資料集名稱:project_id:dataset

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

    更改下列內容:

    • integer:資料表的預設生命週期 (以秒為單位),最小值是 3600 秒 (1 小時)。到期時間為目前時間加整數值。如果您指定 0,系統就會移除資料表到期時間,讓這個資料表永遠不會過期。沒有到期時間的資料表都必須手動刪除。
    • project_id:您的專案 ID。
    • dataset:含有您要更新資料表的資料集名稱。
    • table:您要更新的資料表名稱。

    範例:

    如要將 mydataset 資料集中的 mytable 資料表到期時間更新為 5 天 (432000 秒),請輸入下列指令。mydataset 資料集位於預設專案中。

    bq update --expiration 432000 mydataset.mytable
    

    如要將 mydataset 資料集中的 mytable 資料表到期時間更新為 5 天 (432000 秒),請輸入下列指令。mydataset 資料集位於 myotherproject 專案,而非預設專案。

    bq update --expiration 432000 myotherproject:mydataset.mytable
    
  3. 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");

NUMERICBIGNUMERIC 欄位新增至資料表時,如果未指定捨入模式,系統會自動將捨入模式設為資料表的預設捨入模式。變更資料表的預設捨入模式不會影響現有欄位的捨入模式。

更新資料表的結構定義

如要進一步瞭解如何更新資料表結構定義,請參閱修改資料表結構定義

重新命名資料表

資料表建立後,您可以使用 ALTER TABLE RENAME TO 陳述式重新命名資料表。以下範例會將 mytable 重新命名為 mynewtable

ALTER TABLE mydataset.mytable
RENAME TO mynewtable;

重新命名資料表的限制

  • 如要重新命名正在串流資料的表格,請停止串流、提交所有待處理的串流,並等待 BigQuery 指出串流未在使用中。
  • 通常在上次串流作業的 5 小時後,即可重新命名表格,但有時可能需要更久。
  • 系統會保留現有的資料表 ACL 和資料列存取政策,但不會保留在資料表重新命名期間所做的資料表 ACL 和資料列存取政策更新。
  • 您無法同時重新命名資料表,並對該資料表執行 DML 陳述式。
  • 重新命名資料表會移除資料表上的所有Data Catalog 標記 (已淘汰) 和 Dataplex Universal Catalog 方面
  • 您無法重新命名外部資料表。

複製資料表

本節說明如何建立資料表的完整副本。如要瞭解其他類型的資料表副本,請參閱資料表副本資料表快照

您可以透過下列方式複製資料表:

  • 使用 Google Cloud 控制台。
  • 使用 bq cp 指令。
  • 使用資料定義語言 (DDL) CREATE TABLE COPY 陳述式。
  • 呼叫 jobs.insert API 方法並設定 copy 工作。
  • 使用用戶端程式庫。

複製資料表的限制

資料表複製工作有下列限制:

  • 表格複製作業開始後就無法停止。表格複製作業會非同步執行,即使取消工作也不會停止。跨區域複製資料表時,您也需要支付資料移轉費用,以及目標區域的儲存空間費用。
  • 當您複製資料表時,目的地資料表的名稱必須遵循您建立資料表時所使用的命名慣例。
  • 資料表複製必須遵循 BigQuery 有關複製工作的限制
  • Google Cloud 主控台僅支援一次複製一個資料表。您無法覆寫目的地資料集中的現有資料表。目的地資料集中的資料表名稱不得重複。
  • Google Cloud 控制台不支援將多個來源資料表複製到目的地資料表。
  • 使用 API、bq 指令列工具或用戶端程式庫複製多個來源資料表到目標資料表時,所有來源資料表都必須具有相同的結構定義,包括任何分割或叢集。

    某些資料表結構定義更新 (例如捨棄或重新命名資料欄),可能會導致資料表具有看似相同的結構定義,但內部表示法不同。這可能會導致資料表複製工作失敗,並顯示 Maximum limit on diverging physical schemas reached 錯誤。在這種情況下,您可以使用 CREATE TABLE LIKE 陳述式,確保來源資料表的結構定義與目的地資料表的結構定義完全一致。

  • 由於基礎儲存空間是動態管理,因此 BigQuery 複製資料表所需的時間可能會因不同執行作業而有顯著差異。

  • 如果目的地資料表的資料欄數多於來源資料表,且額外資料欄有預設值,您就無法複製來源資料表並附加至目的地資料表。您可以改為執行 INSERT destination_table SELECT * FROM source_table 來複製資料。

  • 如果複製作業覆寫現有資料表,系統會保留現有資料表的資料表層級存取權。來源資料表的標記不會複製到覆寫的資料表,但現有資料表的標記會保留。不過,跨區域複製資料表時,現有資料表中的標記會遭到移除。

  • 如果複製作業會建立新資料表,新資料表的資料表層級存取權,取決於新資料表所屬資料集的存取政策。此外,系統也會將標記從來源資料表複製到新資料表。

  • 將多個來源資料表複製到目的地資料表時,所有來源資料表都必須具有相同的標記。

必要的角色

如要執行本文中的工作,您需要下列權限。

複製資料表和分區所需的角色

如要取得複製資料表和分區所需的權限,請要求管理員授予來源和目的地資料集的資料編輯者 (roles/bigquery.dataEditor) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

這個預先定義的角色具備複製表格和資料分割區所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:

所需權限

如要複製資料表和分區,您必須具備下列權限:

  • bigquery.tables.getData 來源和目的地資料集
  • bigquery.tables.get 來源和目的地資料集
  • bigquery.tables.create 目的地資料集
  • bigquery.tables.update 目的地資料集

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

執行複製作業的權限

如要取得執行複製工作所需的權限,請要求管理員授予來源和目的地資料集的工作使用者 (roles/bigquery.jobUser) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

這個預先定義的角色具備 bigquery.jobs.create權限,這是執行複製工作時的必要權限。

您或許還可透過自訂角色或其他預先定義的角色取得這項權限。

複製單一來源資料表

您可以透過以下方式複製單一資料表:

  • 使用 Google Cloud 控制台。
  • 使用 bq 指令列工具的 bq cp 指令。
  • 使用資料定義語言 (DDL) CREATE TABLE COPY 陳述式。
  • 呼叫 jobs.insert API 方法、設定 copy 工作,然後指定 sourceTable 屬性。
  • 使用用戶端程式庫。

Google Cloud 控制台和 CREATE TABLE COPY 陳述式在複製工作中,都只支援一個來源資料表和一個目的地資料表。如要將多個來源檔案複製到目的地資料表,請使用 bq 指令列工具或 API。

如要複製單一來源資料表:

主控台

  1. 在「Explorer」面板中,展開專案和資料集,然後選取資料表。

  2. 在詳細資料面板中,按一下「複製資料表」

  3. 在「Copy table」(複製資料表) 對話方塊中的「Destination」(目的地) 下方:

    • 針對「Project name」(專案名稱),選擇將用來儲存複製資料表的專案。
    • 針對「Dataset name」(資料集名稱),選取您要用來儲存已複製資料表的資料集。來源與目的地資料集必須位於相同的位置
    • 在「Table name」(資料表名稱) 部分,輸入新資料表的名稱。目標資料集中的資料表名稱不得重複。您無法使用 Google Cloud 控制台覆寫目的地資料集中現有的資料表。如要進一步瞭解資料表名稱規定,請參閱「資料表命名」。
  4. 按一下 [Copy] (複製) 即可開始複製工作。

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 金鑰保護資料

    如果來源或目的地資料集位於非預設專案中,請採用下列格式將專案 ID 新增至該資料集名稱:project_id:dataset

    (選用) 提供 --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
    
  3. API

    您可以呼叫 bigquery.jobs.insert 方法並設定 copy 工作,透過 API 複製現有資料表。在工作資源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.")

複製多個來源資料表

您可以透過下列方式,將多個來源資料表複製到目的地資料表:

  • 使用 bq 指令列工具的 bq cp 指令。
  • 呼叫 jobs.insert 方法、設定 copy 工作,然後指定 sourceTables 屬性。
  • 使用用戶端程式庫。

所有來源資料表都必須擁有相同的結構定義和標記,且只能有一個目的地資料表。

來源資料表必須指定為逗號分隔的清單。複製多個來源資料表時,無法使用萬用字元。

如要複製多個來源資料表,請選取下列其中一個選項:

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 金鑰保護資料

    如果來源或目的地資料集位於非預設專案中,請採用下列格式將專案 ID 新增至該資料集名稱:project_id:dataset

    (選用) 提供 --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.mytablemydataset.mytable2 資料表,並將資料附加到有相同名稱的目的地資料表,請輸入下列指令。來源資料集位於預設專案中。目的地資料集位於 myotherproject 專案中。-a 快速鍵是用來附加到目的地資料表。

    bq cp -a \
    mydataset.mytable,mydataset.mytable2 \
    myotherproject:myotherdataset.mytable
  3. 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))

跨區域複製資料表

您可以將資料表、資料表快照資料表副本,從一個 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 指令

  3.    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:目的地資料集中的資料表名稱。

    以下範例指令會將 us 多區域的 mydataset_us.mytable 資料表複製到 eu 多區域的 mydataset_eu.mytable2 資料表。這兩個資料集都在預設專案中。

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

    如要跨區域將資料表複製到已啟用 CMEK 的目的地資料集,您必須在資料表上啟用 CMEK,並使用資料表所在區域的金鑰。資料表上的 CMEK 不必與目的地資料集使用的 CMEK 相同。以下範例使用 bq cp 指令,將啟用 CMEK 的資料表複製到目的地資料集。

    bq cp source-project-id:source-dataset-id.source-table-id destination-project-id:destination-dataset-id.destination-table-id
    

    反之,如要將已啟用 CMEK 的資料表跨區域複製到目的地資料集,您可以在目的地資料集上啟用 CMEK,並使用目的地資料集區域的金鑰。您也可以在 bq cp 指令中使用 destination_kms_keys 旗標,如下列範例所示:

    bq cp --destination_kms_key=projects/project_id/locations/eu/keyRings/eu_key/cryptoKeys/eu_region 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 陳述式複製資料表。
  • 如果來源資料表有任何政策標記,您就無法複製該資料表。
  • 如果來源資料表大於 20 個實體 TiB,就無法複製資料表。如要查看來源資料表的實際大小,請參閱取得資料表的相關資訊。此外,跨區域複製大於 1 個實體 TiB 的來源資料表時,可能需要多次重試才能成功複製。
  • 您無法複製與資料表相關聯的 IAM 政策。複製完成後,您可以將相同的政策套用至目的地。
  • 如果複製作業會覆寫現有資料表,現有資料表上的標記就會移除。
  • 您無法將多個來源資料表複製到單一目的地資料表。
  • 您無法在附加模式下複製表格。
  • 時空旅行資訊不會複製到目標區域。
  • 將資料表副本或快照複製到新區域時,系統會建立資料表的完整副本。這會產生額外儲存費用。

查看目前的配額用量

您可以執行 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-REGION_NAME`.INFORMATION_SCHEMA.JOBS_BY_PROJECT
WHERE date(creation_time)= CURRENT_DATE()

如要查看複製工作的配額限制,請參閱「配額與限制 - 複製工作」。

刪除資料表

您可以透過下列方式刪除資料表:

  • 使用 Google Cloud 控制台。
  • 使用資料定義語言 (DDL) DROP TABLE 陳述式。
  • 使用 bq 指令列工具 bq rm 指令。
  • 呼叫 tables.delete API 方法
  • 使用用戶端程式庫。

如要刪除資料集中的所有資料表,請刪除資料集

刪除資料表時,也會刪除資料表中的所有資料。如要讓系統在指定時間後自動刪除資料表,請設定資料集的預設資料表到期時間,或是在建立資料表時設定到期時間。

刪除資料表時,也會刪除與該資料表相關聯的所有權限。重新建立已刪除的資料表時,您也必須手動重新設定先前與該資料表相關聯的存取權

必要的角色

如要取得刪除資料表所需的權限,請要求管理員授予您資料集的資料編輯者 (roles/bigquery.dataEditor) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

這個預先定義的角色具備刪除資料表所需的權限。如要查看確切的必要權限,請展開「必要權限」部分:

所需權限

如要刪除資料表,您必須具備下列權限:

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

您或許還可透過自訂角色或其他預先定義的角色取得這些權限。

刪除資料表

如何刪除資料表:

主控台

  1. 在「Explorer」面板中,展開專案和資料集,然後選取資料表。

  2. 在詳細資料面板中,按一下「Delete table」(刪除資料表)

  3. 在對話方塊中輸入 "delete",然後按一下「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 捷徑) 來略過確認程序。

    如果資料表位於非預設專案的資料集中,請使用下列格式將專案 ID 新增至資料集名稱:project_id:dataset

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

    更改下列內容:

    • project_id:您的專案 ID
    • dataset:含有資料表的資料集名稱
    • table:要刪除的資料表名稱

    範例:

    如要從 mydataset 資料集刪除 mytable 資料表,請輸入下列指令。mydataset 資料集位於預設專案中。

    bq rm -t mydataset.mytable
    

    如要從 mydataset 資料集刪除 mytable 資料表,請輸入下列指令。mydataset 資料集位於 myotherproject 專案,而非預設專案。

    bq rm -t myotherproject:mydataset.mytable
    

    如要從 mydataset 資料集刪除 mytable 資料表,請輸入下列指令。mydataset 資料集位於預設專案中。這個指令使用 -f 捷徑略過確認程序。

    bq rm -f -t mydataset.mytable
    
  3. 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

還原已刪除的資料表

如要瞭解如何還原或取消刪除資料表,請參閱還原已刪除的資料表

表格安全性

如要控管 BigQuery 資料表的存取權,請參閱「使用 IAM 控管資源存取權」。

後續步驟