使用變異插入、更新及刪除資料

本頁面說明如何使用變異插入、更新和刪除資料。變異代表一系列的插入、更新和刪除作業,Spanner 會以不可分割的形式,將這些作業套用到資料庫中不同的資料列和資料表。異動是專為寫入資料而設計,無法讀取資料表中的資料。許多更新作業必須先讀取現有資料,才能進行修改。在這些情況下,您必須使用讀寫交易,讓 Spanner 讀取資料列,然後在同一個不可分割的作業中套用突變。

雖然您可使用 gRPCREST 修訂變異,但比較常見的方式是透過用戶端程式庫來存取 API。

如果您需要提交大量盲寫作業,但不需要不可分割的交易,可以使用批次寫入功能,大量修改 Spanner 資料表。詳情請參閱「使用批次寫入作業修改資料」。

在資料表中插入新資料列

C++

您可以使用 InsertMutationBuilder() 函式寫入資料。Client::Commit() 會在資料表中新增資料列。系統會以不可分割的形式套用單一批次中的所有插入資料。

此程式碼顯示如何寫入資料:

void InsertData(google::cloud::spanner::Client client) {
  namespace spanner = ::google::cloud::spanner;
  auto insert_singers = spanner::InsertMutationBuilder(
                            "Singers", {"SingerId", "FirstName", "LastName"})
                            .EmplaceRow(1, "Marc", "Richards")
                            .EmplaceRow(2, "Catalina", "Smith")
                            .EmplaceRow(3, "Alice", "Trentor")
                            .EmplaceRow(4, "Lea", "Martin")
                            .EmplaceRow(5, "David", "Lomond")
                            .Build();

  auto insert_albums = spanner::InsertMutationBuilder(
                           "Albums", {"SingerId", "AlbumId", "AlbumTitle"})
                           .EmplaceRow(1, 1, "Total Junk")
                           .EmplaceRow(1, 2, "Go, Go, Go")
                           .EmplaceRow(2, 1, "Green")
                           .EmplaceRow(2, 2, "Forever Hold Your Peace")
                           .EmplaceRow(2, 3, "Terrified")
                           .Build();

  auto commit_result =
      client.Commit(spanner::Mutations{insert_singers, insert_albums});
  if (!commit_result) throw std::move(commit_result).status();
  std::cout << "Insert was successful [spanner_insert_data]\n";
}

C#

您可以使用 connection.CreateInsertCommand() 方法插入資料,這個方法會建立新的 SpannerCommand,以便將資料列插入資料表。SpannerCommand.ExecuteNonQueryAsync() 方法會在資料表中新增資料列。

此程式碼顯示如何插入資料:


using Google.Cloud.Spanner.Data;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;

public class InsertDataAsyncSample
{
    public class Singer
    {
        public int SingerId { get; set; }
        public string FirstName { get; set; }
        public string LastName { get; set; }
    }

    public class Album
    {
        public int SingerId { get; set; }
        public int AlbumId { get; set; }
        public string AlbumTitle { get; set; }
    }

    public async Task InsertDataAsync(string projectId, string instanceId, string databaseId)
    {
        string connectionString = $"Data Source=projects/{projectId}/instances/{instanceId}/databases/{databaseId}";
        List<Singer> singers = new List<Singer>
        {
            new Singer { SingerId = 1, FirstName = "Marc", LastName = "Richards" },
            new Singer { SingerId = 2, FirstName