シーケンスを作成

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) の値です。

こちらもご覧ください