すべてのプロダクト
Search
ドキュメントセンター

Tablestore:自動インクリメント主キー列を設定する

最終更新日:Dec 28, 2024

このトピックでは、自動インクリメント主キー列を設定する方法について説明します。パーティションキーではない主キー列を自動インクリメント主キー列として指定できます。自動インクリメント主キー列を含むテーブルにデータを書き込む場合、Tablestore が自動インクリメント主キー列の値を自動的に生成するため、自動インクリメント主キー列の値を指定する必要はありません。自動インクリメント主キー列に対して生成される値は一意であり、同じパーティションキー値を共有するパーティション内で単調に増加します。

前提条件

OTSClient インスタンスが初期化されていること。詳細については、OTSClient インスタンスを初期化する を参照してください。

手順

  1. テーブルを作成するときに、パーティションキーではない主キー列を自動インクリメント主キー列として指定します。

    INTEGER 型の主キー列のみを自動インクリメント主キー列として指定できます。自動インクリメント主キー列に対して生成される各値は、LONG 型の 64 ビット符号付き整数です。

  2. テーブルにデータを書き込むときは、自動インクリメント主キー列の値を指定する必要はありません。特定の主キー列を自動インクリメント主キー列として指定するだけです。

    テーブルにデータが書き込まれた後に自動インクリメント主キー列の値を取得する場合は、ReturnType パラメーターを RT_PK に設定できます。

    テーブルからデータを読み取る場合は、すべての主キー列の値を指定する必要があります。すべての主キー列の値を取得するには、PutRow、UpdateRow、または BatchWriteRow 操作を呼び出すときに ReturnType パラメーターを RT_PK に設定します。

    データテーブルからデータを読み取るときに、完全な主キーが記録されている場合は、主キーに基づいてデータを読み取ることができます。詳細については、1 行のデータを読み取る および 複数の行のデータを一度に読み取る を参照してください。自動インクリメント主キー列の値が記録されていない場合は、最初の主キー列の値に基づいてデータの範囲を決定してから、データを読み取る必要があります。詳細については、主キー値が特定の範囲内にあるデータを読み取る を参照してください。

    説明

    既存の行を更新する場合に自動インクリメント主キー列の値を記録していない場合は、データを更新する前に GetRange 操作を呼び出して行の主キー情報を取得します。

CreateTable、PutRow、UpdateRow、または BatchWriteRow 操作を呼び出すときに、自動インクリメント主キー列機能を使用できます。

  1. テーブルを作成する

    テーブルを作成するときに自動インクリメント主キー列を作成するには、主キー列の属性を 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")
        }
    }
  2. データを書き込む

    テーブルにデータを書き込むときは、自動インクリメント主キー列の値を指定する必要はありません。特定の主キー列を自動インクリメント主キー列として指定するだけです。

    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")
        }
    }