このトピックでは、自動インクリメント主キー列を設定する方法について説明します。パーティションキーではない主キー列を自動インクリメント主キー列として指定できます。自動インクリメント主キー列を含むテーブルにデータを書き込む場合、Tablestore が自動インクリメント主キー列の値を自動的に生成するため、自動インクリメント主キー列の値を指定する必要はありません。自動インクリメント主キー列に対して生成される値は一意であり、同じパーティションキー値を共有するパーティション内で単調に増加します。
前提条件
OTSClient インスタンスが初期化されていること。詳細については、OTSClient インスタンスを初期化する を参照してください。
手順
テーブルを作成するときに、パーティションキーではない主キー列を自動インクリメント主キー列として指定します。
INTEGER 型の主キー列のみを自動インクリメント主キー列として指定できます。自動インクリメント主キー列に対して生成される各値は、LONG 型の 64 ビット符号付き整数です。
テーブルにデータを書き込むときは、自動インクリメント主キー列の値を指定する必要はありません。特定の主キー列を自動インクリメント主キー列として指定するだけです。
テーブルにデータが書き込まれた後に自動インクリメント主キー列の値を取得する場合は、ReturnType パラメーターを RT_PK に設定できます。
テーブルからデータを読み取る場合は、すべての主キー列の値を指定する必要があります。すべての主キー列の値を取得するには、PutRow、UpdateRow、または BatchWriteRow 操作を呼び出すときに ReturnType パラメーターを RT_PK に設定します。
データテーブルからデータを読み取るときに、完全な主キーが記録されている場合は、主キーに基づいてデータを読み取ることができます。詳細については、1 行のデータを読み取る および 複数の行のデータを一度に読み取る を参照してください。自動インクリメント主キー列の値が記録されていない場合は、最初の主キー列の値に基づいてデータの範囲を決定してから、データを読み取る必要があります。詳細については、主キー値が特定の範囲内にあるデータを読み取る を参照してください。
説明既存の行を更新する場合に自動インクリメント主キー列の値を記録していない場合は、データを更新する前に GetRange 操作を呼び出して行の主キー情報を取得します。
例
CreateTable、PutRow、UpdateRow、または BatchWriteRow 操作を呼び出すときに、自動インクリメント主キー列機能を使用できます。
テーブルを作成する
テーブルを作成するときに自動インクリメント主キー列を作成するには、主キー列の属性を AUTO_INCREMENT に設定するだけです。
次のサンプルコードは、自動インクリメント主キー列を含むテーブルを作成する方法の例を示しています。テーブルには、String 型の pk1 主キー列、Integer 型の pk2 主キー列、および Binary 型の pk3 主キー列が含まれています。 pk1 主キー列はパーティションキーであり、pk2 主キー列は自動インクリメント主キー列です。
import ( "fmt" "github.com/aliyun/aliyun-tablestore-go-sdk/tablestore" ) func CreateTableKeyAutoIncrementSample(client *tablestore.TableStoreClient) { createtableRequest := new(tablestore.CreateTableRequest) tableMeta := new(tablestore.TableMeta) // データテーブルの名前を指定します。 tableMeta.TableName = "incrementsampletable" // データテーブルの主キー情報を構築します。データテーブルの主キー列は、String 型の pk1、Integer 型の pk2、および Binary 型の pk3 です。 pk2 主キー列は自動インクリメント主キー列です。 tableMeta.AddPrimaryKeyColumn("pk1", tablestore.PrimaryKeyType_STRING) tableMeta.AddPrimaryKeyColumnOption("pk2", tablestore.PrimaryKeyType_INTEGER, tablestore.AUTO_INCREMENT) tableMeta.AddPrimaryKeyColumn("pk3", tablestore.PrimaryKeyType_BINARY) tableOption := new(tablestore.TableOption) tableOption.TimeToAlive = -1 tableOption.MaxVersion = 3 reservedThroughput := new(tablestore.ReservedThroughput) reservedThroughput.Readcap = 0 reservedThroughput.Writecap = 0 createtableRequest.TableMeta = tableMeta createtableRequest.TableOption = tableOption createtableRequest.ReservedThroughput = reservedThroughput _, err := client.CreateTable(createtableRequest) if (err != nil) { fmt.Println("Failed to create table with error:", err) } else { fmt.Println("Create table finished") } }
データを書き込む
テーブルにデータを書き込むときは、自動インクリメント主キー列の値を指定する必要はありません。特定の主キー列を自動インクリメント主キー列として指定するだけです。
import ( "fmt" "github.com/aliyun/aliyun-tablestore-go-sdk/tablestore" ) func PutRowWithKeyAutoIncrementSample(client *tablestore.TableStoreClient) { fmt.Println("begin to put row") putRowRequest := new(tablestore.PutRowRequest) putRowChange := new(tablestore.PutRowChange) putRowChange.TableName = "incrementsampletable" // テーブルの作成時に主キー列が追加された順序で主キー列を追加し、pk2 を自動インクリメント主キー列として指定します。 putPk := new(tablestore.PrimaryKey) putPk.AddPrimaryKeyColumn("pk1", "pk1value1") putPk.AddPrimaryKeyColumnWithAutoIncrement("pk2") putPk.AddPrimaryKeyColumn("pk3", []byte("pk3")) putRowChange.PrimaryKey = putPk putRowChange.AddColumn("col1", "col1data1") putRowChange.AddColumn("col2", int64(100)) putRowChange.SetCondition(tablestore.RowExistenceExpectation_IGNORE) putRowRequest.PutRowChange = putRowChange _, err := client.PutRow(putRowRequest) if err != nil { fmt.Println("put row failed with error:", err) } else { fmt.Println("put row finished") } }