本文主要介紹了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

PolarDB-X 1.0支持對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時不需要指定自增列,可以讓PolarDB-X 1.0自動維護。
批量獲取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;