重要
このページは英語版のページを機械翻訳しています。原文はこちらからご覧ください。

シーケンスの作成

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パラメーターの値であり、後続のラウンドの初期値はMinValueINCREMENT > 0)またはMaxValueINCREMENT <0)の値です。

も参照してください