すべてのプロダクト
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 操作を呼び出すときに、自動インクリメント主キー列機能を使用できます。

  • テーブルを作成するときに自動インクリメント主キー列を作成するには、主キー列の属性を AUTO_INCREMENT に設定するだけです。

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

次のサンプルコードは、自動インクリメント主キー列を含むデータテーブルを作成する方法の例を示しています。この例では、テーブルには、STRING 型の Pk1 主キー列と INTEGER 型の Pk2_AutoIncrement 主キー列が含まれています。 Pk1 主キー列はパーティションキーであり、Pk2_AutoIncrement 主キー列は自動インクリメント主キー列です。

using System;
using System.Collections.Generic;
using Aliyun.OTS.DataModel;
using Aliyun.OTS.Request;
using Aliyun.OTS.Response;

namespace Aliyun.OTS.Samples.Samples
{
    /// <summary>
    /// 例: 自動インクリメント主キー列を作成します。
    /// </summary>
    public class AutoIncrementSample
    {
        private static readonly string TableName = "AutoIncrementSample";

        private static readonly string Pk1 = "Pk1";
        private static readonly string Pk2 = "Pk2_AutoIncrement";


        static void Main(string[] args)
        {
            Console.WriteLine("AutoIncrementSample");

            // 自動インクリメント主キー列を含むテーブルを作成します。
            CreateTableWithAutoIncrementPk();

            // 10 行のデータを書き込みます。
            for (int i = 0; i < 10; i++)
            {  
                PutRow(i.ToString());
            }

            Console.ReadLine();

        }

        /// <summary>
        /// 自動インクリメント主キー列を含むテーブルを作成します。
        /// </summary>
        private static void CreateTableWithAutoIncrementPk()
        {

            OTSClient otsClient = Config.GetClient();

            IList<string> tables = otsClient.ListTable(new ListTableRequest()).TableNames;
            if (tables.Contains(TableName))
            {
                return;
            }

            PrimaryKeySchema primaryKeySchema = new PrimaryKeySchema
            {
                { Pk1, ColumnValueType.String },
                // Pk2 を自動インクリメント主キー列として指定します。
                { Pk2, ColumnValueType.Integer, PrimaryKeyOption.AUTO_INCREMENT}
            };
            TableMeta tableMeta = new TableMeta(TableName, primaryKeySchema);

            CapacityUnit reservedThroughput = new CapacityUnit(0, 0);
            CreateTableRequest request = new CreateTableRequest(tableMeta, reservedThroughput);
            otsClient.CreateTable(request);

        }

        public static void PutRow(string pk1Value)
        {
            Console.WriteLine("Start put row...");
            OTSClient otsClient = Config.GetClient();

            // 行の主キーを指定します。主キーは、テーブルの作成時に TableMeta で指定された主キーと同じである必要があります。
            PrimaryKey primaryKey = new PrimaryKey
            {
                { Pk1, new ColumnValue(pk1Value) },
                { Pk2,  ColumnValue.AUTO_INCREMENT }
            };

            // 行の属性列を指定します。
            AttributeColumns attribute = new AttributeColumns
            {
                { "Col1", new ColumnValue(0) }
            };
            PutRowRequest request = new PutRowRequest(TableName, new Condition(RowExistenceExpectation.IGNORE), primaryKey, attribute);
            request.RowPutChange.ReturnType = ReturnType.RT_PK;

            var response =  otsClient.PutRow(request);
            Console.WriteLine("Put row succeed,autoIncrement Pk value:"+ response.Row.GetPrimaryKey()[Pk2].IntegerValue);
        }

    }
}