シーケンスの作成

CREATE SEQUENCEステートメントは TiDB にシーケンス オブジェクトを作成します。シーケンスは、テーブルおよびViewオブジェクトと同等のデータベース オブジェクトです。このシーケンスは、カスタマイズされた方法でシリアル化された ID を生成するために使用されます。

あらすじ

CreateSequenceStmt
CREATESEQUENCEIfNotExistsTableNameCreateSequenceOptionListOptCreateTableOptionListOpt
IfNotExists
IFNOTEXISTS
TableName
Identifier.Identifier
CreateSequenceOptionListOpt
SequenceOption
SequenceOptionList
SequenceOption
SequenceOption
INCREMENT=BYSTART=WITHMINVALUEMAXVALUECACHE=SignedNumNOMINVALUENOMINVALUEMAXVALUECACHECYCLENOMAXVALUENOCACHECYCLENOCYCLE

構文

CREATE [TEMPORARY] SEQUENCE [IF NOT EXISTS] sequence_name [ INCREMENT [ BY | = ] increment ] [ MINVALUE [=] minvalue | NO MINVALUE | NOMINVALUE ] [ MAXVALUE [=] maxvalue | NO MAXVALUE | NOMAXVALUE ] [ START [ WITH | = ] start ] [ CACHE [=] cache | NOCACHE | NO CACHE] [ CYCLE | NOCYCLE | NO CYCLE] [table_options]

パラメーター

パラメーターデフォルト値説明
TEMPORARYfalseTiDB は現在TEMPORARYオプションをサポートしておらず、それに対する構文の互換性のみを提供します。
INCREMENT1シーケンスの増分を指定します。その正または負の値は、シーケンスの成長方向を制御できます。
MINVALUE1または-9223372036854775807シーケンスの最小値を指定します。 INCREMENT > 0の場合、デフォルト値は1です。 INCREMENT < 0の場合、デフォルト値は-9223372036854775807です。
MAXVALUE9223372036854775806または-1シーケンスの最大値を指定します。 INCREMENT > 0の場合、デフォルト値は9223372036854775806です。 INCREMENT < 0の場合、デフォルト値は-1です。
STARTMINVALUEまたはMAXVALUEシーケンスの初期値を指定します。 INCREMENT > 0の場合、デフォルト値はMINVALUEです。 INCREMENT < 0の場合、デフォルト値はMAXVALUEです。
CACHE1000TiDB 内のシーケンスのローカル キャッシュ サイズを指定します。
CYCLENO CYCLEシーケンスを最小値 (降順シーケンスの場合は最大値) から再開するかどうかを指定します。 INCREMENT > 0の場合、デフォルト値はMINVALUEです。 INCREMENT < 0の場合、デフォルト値はMAXVALUEです。

SEQUENCE機能

次の式関数を使用してシーケンスを制御できます。

  • NEXTVALまたはNEXT VALUE FOR

    基本的に、どちらもシーケンス オブジェクトのnextval()の有効な値を取得する関数です。 nextval()関数のパラメータはシーケンスのidentifierです。

  • LASTVAL

    この関数は、このセッションで最後に使用された値を取得します。値が存在しない場合は、 NULLが使用されます。この関数のパラメータはシーケンスのidentifierです。

  • SETVAL

    この関数は、シーケンスの現在値の進行を設定します。この関数の最初のパラメータはシーケンスのidentifierです。 2 番目のパラメータはnumです。

ノート:

TiDB でのシーケンスの実装では、 SETVAL関数はこのシーケンスの初期進行またはサイクル進行を変更できません。この関数は、この進行に基づいて次の有効な値のみを返します。

  • デフォルトのパラメータを使用してシーケンス オブジェクトを作成します。

    CREATE SEQUENCE seq;
    Query OK, 0 rows affected (0.06 sec)
  • nextval()関数を使用して、シーケンス オブジェクトの次の値を取得します。

    SELECT nextval(seq);
    +--------------+ | nextval(seq) | +--------------+ | 1 | +--------------+ 1 row in set (0.02 sec)
  • lastval()関数を使用して、このセッションのシーケンス オブジェクトへの最後の呼び出しによって生成された値を取得します。

    SELECT lastval(seq);
    +--------------+ | lastval(seq) | +--------------+ | 1 | +--------------+ 1 row in set (0.02 sec)
  • setval()関数を使用して、シーケンス オブジェクトの現在値 (または現在位置) を設定します。

    SELECT setval(seq, 10);
    +-----------------+ | setval(seq, 10) | +-----------------+ | 10 | +-----------------+ 1 row in set (0.01 sec)
  • next value for構文を使用してシーケンスの次の値を取得することもできます。

    SELECT next value for seq;
    +--------------------+ | next value for seq | +--------------------+ | 11 | +--------------------+ 1 row in set (0.00 sec)
  • デフォルトのカスタムパラメータを使用してシーケンスオブジェクトを作成します。

    CREATE SEQUENCE seq2 start 3 increment 2 minvalue 1 maxvalue 10 cache 3;
    Query OK, 0 rows affected (0.01 sec)
  • シーケンス オブジェクトがこのセッションで使用されていない場合、 lastval()関数は値NULLを返します。

    SELECT lastval(seq2);
    +---------------+ | lastval(seq2) | +---------------+ | NULL | +---------------+ 1 row in set (0.01 sec)
  • シーケンス オブジェクトのnextval()関数の最初の有効な値は、 STARTパラメータの値です。

    SELECT nextval(seq2);
    +---------------+ | nextval(seq2) | +---------------+ | 3 | +---------------+ 1 row in set (0.00 sec)
  • setval()関数はシーケンス オブジェクトの現在の値を変更できますが、次の値の等差数列規則を変更することはできません。

    SELECT setval(seq2, 6);
    +-----------------+ | setval(seq2, 6) | +-----------------+ | 6 | +-----------------+ 1 row in set (0.00 sec)
  • nextval()を使用して次の値を取得すると、次の値はシーケンスで定義された等差数列規則に従います。

    SELECT next value for seq2;
    +---------------------+ | next value for seq2 | +---------------------+ | 7 | +---------------------+ 1 row in set (0.00 sec)
  • 次の例のように、シーケンスの次の値を列のデフォルト値として使用できます。

    CREATE table t(a int default next value for seq2);
    Query OK, 0 rows affected (0.02 sec)
  • 次の例では、値が指定されていないため、デフォルト値のseq2が使用されます。

    INSERT into t values();
    Query OK, 1 row affected (0.00 sec)
    SELECT * from t;
    +------+ | a | +------+ | 9 | +------+ 1 row in set (0.00 sec)
  • 次の例では、値が指定されていないため、デフォルト値のseq2が使用されます。ただし、次の値seq2上記の例 ( CREATE SEQUENCE seq2 start 3 increment 2 minvalue 1 maxvalue 10 cache 3; ) で定義された範囲内にないため、エラーが返されます。

    INSERT into t values();
    ERROR 4135 (HY000): Sequence 'test.seq2' has run out

MySQLの互換性

このステートメントは TiDB 拡張機能です。この実装は、MariaDB で利用可能なシーケンスに基づいてモデル化されています。

SETVALの関数を除いて、他のすべての関数はMariaDB と同じ進行になります。ここでの「数列」とは、数列内の数値が、その数列によって定義された特定の等差数列規則に従うことを意味します。 SETVALを使用してシーケンスの現在値を設定できますが、シーケンスの後続の値は元の進行ルールに従います。

例えば:

1, 3, 5, ... // The sequence starts from 1 and increments by 2. select setval(seq, 6) // Sets the current value of a sequence to 6. 7, 9, 11, ... // Subsequent values still follow the progression rule.

CYCLEモードでは、最初のラウンドのシーケンスの初期値はSTARTパラメーターの値であり、後続のラウンドの初期値はMinValue ( INCREMENT > 0) またはMaxValue ( INCREMENT < 0) の値です。

こちらも参照

このページは役に立ちましたか?

Playground
登録なしで TiDB の機能をワンストップでインタラクティブに体験できます。
製品
TiDB Cloud
TiDB
価格
PoC お問い合わせ
エコシステム
TiKV
TiFlash
OSS Insight
© 2024 PingCAP. All Rights Reserved.
Privacy Policy.