このページでは、ミューテーションを使ってデータを挿入、更新、削除する方法について説明します。ミューテーションは、データベース内のさまざまな行やテーブルに対して、Spanner によってアトミックに適用される一連の操作(挿入、更新、削除)を表します。ミューテーションはデータの書き込み用に設計されています。テーブルからデータを読み取ることはできません。多くの更新オペレーションでは、変更を行う前に既存のデータを読み取る必要があります。このようなユースケースでは、読み取り / 書き込みトランザクションを使用する必要があります。これにより、Spanner は行を読み取り、同じアトミック オペレーション内でミューテーションを適用できます。
ミューテーションは gRPC や REST を使って commit することもできますが、通常はクライアント ライブラリを通じて API にアクセスするのが一般的です。
多数の盲目的書き込みを commit する必要があるものの、アトミック トランザクションは必要ない場合は、バッチ書き込みを使用して Spanner テーブルを一括変更できます。詳細については、バッチ書き込みを使用してデータを変更するをご覧ください。
テーブルに新しい行を挿入する
C++
データの書き込みには InsertMutationBuilder() 関数を使用します。
Client::Commit() によってテーブルに新しい行が追加されます。1 つのバッチ内の挿入はすべてアトミックに適用されます。
次のコードはデータの書き込み方法を示したものです。
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 のページにサンプルがあります。