このページでは、ミューテーションを使用してデータを挿入、更新、削除する方法を説明します。ミューテーションは、Spanner データベース内のさまざまな行やテーブルに対して、Spanner によってアトミックに適用される一連の操作(挿入、更新、削除)を表します。
ミューテーションは gRPC または REST を使用して commit することもできますが、クライアント ライブラリから API にアクセスするほうが一般的な方法です。
このページでは、挿入、更新、削除の基本的なタスクについて説明します。詳しい例については、入門チュートリアルをご覧ください。
多数の盲目的書き込みを commit する必要があるが、アトミック トランザクションは必要ない場合は、バッチ書き込みを使用して Spanner テーブルを一括変更できます。詳細については、バッチ書き込みを使用してデータを変更するをご覧ください。
テーブルに新しい行を挿入します。
C++
データの書き込みには InsertMutationBuilder()
関数を使用します。
Client::Commit()
はテーブルに新しい行を追加します。同一のバッチ内の挿入はすべてアトミックに適用されます。
次のコードは、データを書き込む方法を示します。
C#
データを挿入するには、connection.CreateInsertCommand()
メソッドを使用します。このメソッドでは、行をテーブルに挿入するための新しい SpannerCommand
を作成します。SpannerCommand.ExecuteNonQueryAsync()
メソッドを使用すると、テーブルに新しい行を追加できます。
次のコードは、データの挿入方法を示しています。
Go
データの書き込みには Mutation
を使用します。Mutation
はミューテーション オペレーションのコンテナです。Mutation
は挿入、更新、削除など、Spanner データベース内のさまざまな行やテーブルにアトミックに適用される一連の操作を表します。
Mutation.InsertOrUpdate()
を使用して INSERT_OR_UPDATE
ミューテーションを作成できます。これによって新しい行が追加されます。行がすでに存在している場合は列値が更新されます。あるいは、Mutation.Insert()
メソッドを使用して、新しい行を追加する INSERT
ミューテーションを作成します。
Client.Apply()
を使用してデータベースにミューテーションをアトミックに適用します。
次のコードは、データを書き込む方法を示します。
Java
データの書き込みには Mutation
オブジェクトを使用します。Mutation
オブジェクトは、ミューテーション オペレーションのコンテナです。Mutation
は、Spanner データベース内のさまざまな行やテーブルに対して、Spanner によってアトミックに適用される一連の操作(挿入、更新、削除)を表します。
Mutation
クラスの newInsertBuilder()
メソッドは、テーブルに新しい行を挿入する INSERT
ミューテーションを作成します。行がすでに存在する場合、書き込みは失敗します。または、newInsertOrUpdateBuilder
メソッドを使用して INSERT_OR_UPDATE
ミューテーションを作成できます。これにより、行がすでに存在している場合に列値が更新されます。
DatabaseClient
クラスの write()
メソッドはミューテーションを書き込みます。1 つのバッチ内のすべてのミューテーションはアトミックに適用されます。
次のコードは、データを書き込む方法を示します。
Node.js
データの書き込みには Table
オブジェクトを使用します。Table.insert()
メソッドを使用すると、テーブルに新しい行を追加できます。1 つのバッチ内の挿入はすべてアトミックに適用されます。
次のコードは、データを書き込む方法を示します。
PHP
データの書き込みには Database::insertBatch
メソッドを使用します。insertBatch
はテーブルに新しい行を追加します。1 つのバッチ内の挿入はすべてアトミックに適用されます。
次のコードは、データを書き込む方法を示します。
Python
データの書き込みには Batch
オブジェクトを使用します。Batch
オブジェクトは、ミューテーション オペレーションのコンテナです。ミューテーションは挿入、更新、削除など、Spanner データベース内のさまざまな行やテーブルにアトミックに適用される一連の操作を表します。
Batch
クラスの insert()
メソッドは、バッチに 1 つ以上の挿入ミューテーションを追加するために使用されます。1 つのバッチ内のすべてのミューテーションはアトミックに適用されます。
次のコードは、データを書き込む方法を示します。
Ruby
データの書き込みには Client
オブジェクトを使用します。Client#commit
メソッドは、データベース内の列、行、テーブルにまたがる時点の単一の論理ポイントでアトミックに実行される書き込みトランザクションを作成し、commit します。
次のコードは、データを書き込む方法を示します。
テーブル内の行を更新する
Albums(1, 1)
の売上が予想を下回っているとします。そのため、Albums(2, 2)
のマーケティング予算から $200,000 を Albums(1, 1)
に充てる必要があります(ただし、この金額が Albums(2, 2)
の予算内で利用可能な場合のみ)。
新しい値を書き込むかどうかを判断するために、テーブル内のデータを読み取る必要があります。このため、読み取り / 書き込みトランザクションを使用して、読み取りと書き込みをアトミックに行います。
C++
Transaction()
関数を使用して、クライアントのトランザクションを実行します。
トランザクションを実行するコードを次に示します。
C#
.NET Standard 2.0(または .NET 4.5)以上の場合は、.NET フレームワークの TransactionScope()
を使用して、トランザクションを実行できます。サポートされている .NET バージョンでトランザクションを作成するには、SpannerConnection.BeginTransactionAsync
の結果を SpannerCommand
の Transaction
プロパティとして設定します。
トランザクションは次の 2 つの方法で実行できます。
.NET Standard 2.0
.NET Standard 1.5
Go
ReadWriteTransaction
タイプを使用して、読み取り / 書き込みトランザクションのコンテキストで一連の作業を実行します。Client.ReadWriteTransaction()
は ReadWriteTransaction
オブジェクトを返します。
サンプルでは、データの行を取得するために ReadWriteTransaction.ReadRow()
が使用されています。
また、サンプルでは ReadWriteTransaction.BufferWrite()
も使用されています。これにより、トランザクションが commit されるときに適用される更新のセットにミューテーションのリストが追加されます。
サンプルでは、Spanner のテーブルまたはインデックスの行キーを表す Key
タイプも使用されます。
Java
TransactionRunner
インターフェースを使用して、読み取り / 書き込みトランザクションのコンテキストで一連の作業を実行します。このインターフェースにはメソッド run()
が含まれます。これは読み取り / 書き込みトランザクションを実行し、必要に応じて再試行するために使用されます。DatabaseClient
クラスの readWriteTransaction
メソッドは、1 回の論理トランザクションを実行する TransactionRunner
オブジェクトを返します。
TransactionRunner.TransactionCallable
クラスには、トランザクションを 1 回試行する run()
メソッドが含まれます。run()
は、トランザクションのコンテキストである TransactionContext
オブジェクトを受け取ります。
サンプルでは、readRow()
呼び出しの結果を格納するのに便利な Struct
クラスが使用されています。またサンプルでは、Spanner のテーブルまたはインデックスの行キーを表す Key
クラスも使用されています。
トランザクションを実行するコードを次に示します。
Node.js
Database.runTransaction()
を使用して、トランザクションを実行します。
トランザクションを実行するコードを次に示します。
PHP
Database::runTransaction
を使用して、トランザクションを実行します。
トランザクションを実行するコードを次に示します。
Python
Database
クラスの run_in_transaction()
メソッドを使用して、トランザクションを実行します。
トランザクションを実行するコードを次に示します。
Ruby
Client
クラスの transaction
メソッドを使用して、トランザクションを実行します。
トランザクションを実行するコードを次に示します。
テーブル内の行を削除する
各クライアント ライブラリには、行を削除するための方法として、以下の複数の方法があります。
- テーブル内のすべての行を削除する。
- 行に対するキー列の値を指定して、単一行を削除する。
- キー範囲を作成して、行のグループを削除する。
- インターリーブされたテーブル内の行を削除するには、そのテーブルがスキーマ定義に
ON DELETE CASCADE
を含む場合、親行を削除する。
C++
クライアントの DeleteMutationBuilder()
関数を使用して行を削除します。
次のコードは、データを削除する方法を示しています。
C#
行を削除するには connection.CreateDeleteCommand()
メソッドを使用します。このメソッドは、行を削除する新しい SpannerCommand
を作成します。SpannerCommand.ExecuteNonQueryAsync()
メソッドは、テーブルから行を削除します。
このサンプルでは、Singers
テーブル内の行を個別に削除します。Albums
テーブルが Singers
テーブル内にインターリーブされ、ON DELETE CASCADE
が定義されているため、Albums
テーブル内の行が削除されます。
Go
行を削除するには Mutation
を使用します。Mutation.Delete()
メソッドを使用して、行を削除する DELETE
ミューテーションを作成します。Client.Apply()
メソッドは、ミューテーションをデータベースにアトミックに適用します。
このサンプルでは、Albums
テーブル内の行を個別に削除してから、KeyRange を使用して Singers
テーブル内のすべての行を削除します。
Java
行を削除するには Mutation.delete()
メソッドを使用します。
このサンプルでは、KeySet.all()
メソッドを使用して Albums
テーブルのすべての行を削除します。Albums
テーブルの行を削除した後、このサンプルでは、KeySet.singleKey()
メソッドで作成されたキーを使用して Singers
テーブルの行を個別に削除します。
Node.js
行を削除するには table.deleteRows()
メソッドを使用します。
このサンプルでは、table.deleteRows()
メソッドを使用して Singers
テーブルからすべての行を削除します。Albums
テーブルが Singers
テーブル内にインターリーブされ、ON
DELETE CASCADE
が定義されているため、Albums
テーブル内の行が削除されます。
PHP
行を削除するには Database::delete() method
を使用します。Database::delete()
メソッドのページにサンプルがあります。
Python
行を削除するには Batch.delete()
メソッドを使用します。
このサンプルでは、KeySet
オブジェクトを使用して、Albums
テーブルと Singers
テーブルのすべての行を個別に削除します。
Ruby
行を削除するには Client#delete
メソッドを使用します。Client#delete
のページにサンプルがあります。