本文主要介绍了Sequence的显式用法。

创建Sequence

Group Sequence
  • 语法
    CREATE [ GROUP ] SEQUENCE <name>
    [ START WITH <numeric value> ]
  • 参数说明
    参数 说明
    START WITH Group Sequence 的起始值,若未指定,则默认起始值为100001。
  • 示例
    • 方法一
      mysql> CREATE SEQUENCE seq1;
    • 方法二
      mysql> CREATE GROUP SEQUENCE seq1;
单元化 Group Sequence
  • 语法
    CREATE [ GROUP ] SEQUENCE <name>
    [ START WITH <numeric value> ]
    [ UNIT COUNT <numeric value> INDEX <numeric value> ]
  • 参数说明
    参数 说明
    START WITH 单元化Group Sequence的起始值,默认起始值依赖于单元数量和单元索引;若单元数量和单元索引未被指定或为默认值,则默认起始值为100001。
    UNIT COUNT 单元化Group Sequence的单元数量,默认值为1。
    INDEX 单元化Group Sequence的单元索引,取值范围为 [ 0, 单元数量 - 1 ],默认值为0。
    说明
    • 如果未指定类型关键字,则默认类型为 Group Sequence
    • Group Sequence单元化Group Sequence是非连续的。START WITH参数对于它们仅具有指导意义,Group Sequence单元化Group Sequence不会严格按照该参数作为起始值,但是保证起始值比该参数大。
    • 可以将Group Sequence看作单元化Group Sequence的一个特例,即UNIT COUNT = 1 且 INDEX = 0 时的单元化Group Sequence
  • 示例

    创建包含3个单元的全局唯一数字序列(将3个同名的、指定了相同单元数量和不同单元索引的单元化Group Sequence,分别用于3个不同的实例或库,组成一个全局唯一数字序列)。

    1. 实例1/库1:
      mysql> CREATE GROUP SEQUENCE seq2 UNIT COUNT 3 INDEX 0;
    2. 实例2/库2:
      mysql> CREATE GROUP SEQUENCE seq2 UNIT COUNT 3 INDEX 1;
    3. 实例3/库3:
      mysql> CREATE GROUP SEQUENCE seq2 UNIT COUNT 3 INDEX 2;
Time-based Sequence
  • 语法
    CREATE TIME SEQUENCE <name>
    注意 存储Time-based Sequence值的列必须为BIGINT类型。
  • 示例
    7mysql> CREATE TIME SEQUENCE seq3;
Simple Sequence
  • 语法
    CREATE SIMPLE SEQUENCE <name>
    [ START WITH <numeric value> ]
    [ INCREMENT BY <numeric value> ]
    [ MAXVALUE <numeric value> ][ CYCLE | NOCYCLE ]
  • 参数说明
    参数 说明
    START WITH Simple Sequence的起始值,若未指定,则默认起始值为1。
    INCREMENT BY Simple Sequence每次增长时的增量值(或称为间隔值或步长),若未指定,则默认值为1。
    MAXVALUE Simple Sequence允许的最大值,若未指定,则默认值为有符号长整型(Signed BIGINT)的最大值,即9223372036854775807。
    CYCLE 或 NOCYCLE 两者只能选择其一,代表当Simple Sequence增长到最大值后,是否允许继续循环(即从START WITH重新开始)使用该Simple Sequence。若未指定,则默认值为NOCYCLE。
  • 示例

    创建一个Simple Sequence,起始值是1000,步长为2,最大值为99999999999,增长到最大值后不继续循环。

    mysql> CREATE SIMPLE SEQUENCE seq4 START WITH 1000 INCREMENT BY 2 MAXVALUE 99999999999 NOCYCLE;

修改Sequence

DRDS支持对Sequence的各种类型进行如下修改:

  • 修改Simple Sequence的参数:起始值、步长、最大值、循环或非循环。
  • 修改Group Sequence或单元化 Group Sequence的参数:起始值。
  • 不同类型Sequence间的转换(单元化Group Sequence除外)。
注意事项
  • Group Sequence和单元化Group Sequence是非连续的。START WITH参数对于它们仅具有指导意义,Group Sequence和单元化Group Sequence不会严格按照该参数作为起始值,但是保证起始值比该参数大。
  • 单元化Group Sequence不支持转换到其它类型或修改单元化相关的参数。
  • 对于Simple Sequence,如果修改Sequence时指定了START WITH,则会立即生效,下次取Sequence值时会从新的START WITH值开始。比如原先Sequene增长到100,这时把START WITH值改成了200,那么下一次获取的Sequence值就从200开始。
  • 修改START WITH的参数值时,需要仔细评估已经产生的Sequence值,以及生成新Sequence值的速度,防止产生冲突。如非必要,请谨慎修改START WITH参数值。
Group Sequence
  • 语法
    ALTER SEQUENCE <name> [ CHANGE TO SIMPLE | TIME ]
    START WITH <numeric value>
    [ INCREMENT BY <numeric value> ]
    [ MAXVALUE <numeric value> ]
    [ CYCLE | NOCYCLE ]
  • 参数说明
    参数 说明
    START WITH Sequence的起始值,无默认值,若未指定则忽略该参数,在转换类型时必须指定。
    INCREMENT BY 仅在将Group Sequence转换为Simple Sequence时有效,是Simple Sequence每次增长时的增量值(或称为间隔值或步长),若未指定,则默认值为1。
    MAXVALUE 仅在将Group Sequence转换为Simple Sequence时有效,是Simple Sequence允许的最大值,若未指定,则默认值为有符号长整型(Signed BIGINT)的最大值,即9223372036854775807。
    CYCLE 或 NOCYCLE 仅在将Group Sequence转换为Simple Sequence时有效,两者只能选择其一,代表当Simple Sequence值增长到最大值后,是否允许继续循环(即从START WITH重新开始)使用该Simple Sequence,若未指定,则默认值为NOCYCLE。
    说明 当修改的目标类型为TIME时,不支持上述参数。
单元化Group Sequence
  • 语法
    ALTER SEQUENCE <name> 
    START WITH <numeric value>
  • 参数说明
    参数 说明
    START WITH 单元化Group Sequence的起始值,无默认值,若未指定则忽略该参数。
    说明 单元化Group Sequence 不支持转换到其它类型或修改单元化相关的参数。
Time-based Sequence
  • 语法
    ALTER SEQUENCE <name>[ CHANGE TO GROUP | SIMPLE ]
    START WITH <numeric value>
    [ INCREMENT BY <numeric value> ]
    [ MAXVALUE <numeric value> ]
    [ CYCLE | NOCYCLE ]
  • 参数说明
    参数 说明
    START WITH Sequence的起始值,无默认值,若未指定则忽略该参数,在转换类型时必须指定。
    INCREMENT BY Simple Sequence每次增长时的增量值(或称为间隔值或步长),若未指定,则默认值为1,将Simple Sequence转换为Group Sequence时该参数无效。
    MAXVALUE Simple Sequence允许的最大值,若未指定,则默认值为有符号长整型(Signed BIGINT)的最大值,即9223372036854775807,将Simple Sequence转换为Group Sequence时该参数无效。
    CYCLE或NOCYCLE 两者只能选择其一,代表当Simple Sequence值增长到最大值后,是否允许继续循环(即仍从START WITH开始)使用该Simple Sequence,若未指定,则默认值为NOCYCLE,将Simple Sequence转换为Group Sequence时该参数无效。
Simple Sequence
  • 语法
    ALTER SEQUENCE <name> [ CHANGE TO GROUP | TIME ]
    START WITH <numeric value>
    [ INCREMENT BY <numeric value> ]
    [ MAXVALUE <numeric value> ]
    [ CYCLE | NOCYCLE ]
  • 参数说明
    参数 说明
    START WITH Sequence的起始值,无默认值,若未指定则忽略该参数,在转换类型时必须指定。
    INCREMENT BY Simple Sequence每次增长时的增量值(或称为间隔值或步长),若未指定,则默认值为1,将Simple Sequence转换为Group Sequence时该参数无效。
    MAXVALUE Simple Sequence允许的最大值,若未指定,则默认值为有符号长整型(Signed BIGINT)的最大值,即9223372036854775807,将Simple Sequence转换为Group Sequence时该参数无效。
    CYCLE 或 NOCYCLE 两者只能选择其一,代表当Simple Sequence值增长到最大值后,是否允许继续循环(即仍从START WITH开始)使用该Simple Sequence,若未指定,则默认值为NOCYCLE,将Simple Sequence转换为Group Sequence时该参数无效。
    说明 当修改的目标类型为TIME时,不支持上述参数。
不同类型Sequence间的转换

在对Sequence的不同类型进行转换时,您需要了解如下事项:

  • 通过ALTER SEQUENCECHANGE TO <sequence_type>子句实现。
  • ALTER SEQUENCE如果指定了CHANGE TO子句,则强制必须加上START WITH参数,避免忘记指定起始值而造成取值时得到重复值;若没有CHANGE TO(可选参数),则不强制。
  • 不支持单元化Group Sequence作为源或目标的类型转换。
示例
  • 将Simple Sequence seq4的起始值改为3000,步长改为5,最大值改为1000000,增长到最大值后改为继续循环。语句如下:
    mysql> ALTER SEQUENCE seq4 START WITH 3000 INCREMENT BY 5 MAXVALUE 1000000 CYCLE;
  • 将Group Sequence转换为Simple Sequence。
    mysql> ALTER SEQUENCE seq1 CHANGE TO SIMPLE START WITH 1000000;

查询与获取Sequence

查询Sequence
  • 语法
    SHOW SEQUENCES
  • 示例
    mysql> SHOW SEQUENCES;

    返回结果如下:

    +------+--------+------------+------------+------------+--------------+------------+-------------+-------+--------+
    | NAME | VALUE  | UNIT_COUNT | UNIT_INDEX | INNER_STEP | INCREMENT_BY | START_WITH | MAX_VALUE   | CYCLE | TYPE   |
    +------+--------+------------+------------+------------+--------------+------------+-------------+-------+--------+
    | seq1 | 100000 | 1          | 0          | 100000     | N/A          | N/A        | N/A         | N/A   | GROUP  |
    | seq2 | 400000 | 3          | 1          | 100000     | N/A          | N/A        | N/A         | N/A   | GROUP  |
    | seq3 | N/A    | N/A        | N/A        | N/A        | N/A          | N/A        | N/A         | N/A   | TIME   |
    | seq4 | 1006   | N/A        | N/A        | N/A        | 2            | 1000       | 99999999999 | N     | SIMPLE |
    +------+--------+------------+------------+------------+--------------+------------+-------------+-------+--------+
    4 rows in set (0.00 sec)
    说明 返回结果中的TYPE列,显示的是Sequence类型的缩写。
获取显式Sequence值
  • 语法
    [<schema_name>.]<sequence name>.NEXTVAL
  • 示例
    • 方法一
      mysql> SELECT sample_seq.nextval FROM dual;

      返回结果如下:

      +--------------------+
      | SAMPLE_SEQ.NEXTVAL |
      +--------------------+
      |             101001 |
      +--------------------+
      1 row in set (0.04 sec)
    • 方法二
      mysql> INSERT INTO some_users (name,address,gmt_create,gmt_modified,intro) VALUES ('sun',sample_seq.nextval,now(),now(),'aa');
      说明
      • 该方法是把sample_seq.nextval当做一个值写入了 SQL中。
      • 如果建表时已经指定了AUTO_INCREMENT参数,INSERT时不需要指定自增列,可以让DRDS自动维护。
批量获取Sequence值
  • 语法

    批量获取Sequence值的语法如下:

    SELECT [<schema_name>.]<sequence name>.NEXTVAL FROM DUAL WHERE COUNT = <numeric value>
  • 示例
    mysql> SELECT sample_seq.nextval FROM dual WHERE count = 10;

    返回结果如下:

    +--------------------+
    | SAMPLE_SEQ.NEXTVAL |
    +--------------------+
    |             101002 |
    |             101003 |
    |             101004 |
    |             101005 |
    |             101006 |
    |             101007 |
    |             101008 |
    |             101009 |
    |             101010 |
    |             101011 |
    +--------------------+
    10 row in set (0.04 sec)

删除Sequence

  • 语法
    DROP SEQUENCE <name>
  • 示例
    mysql> DROP SEQUENCE seq3;