本文主要介紹了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;
- 方法一
- 文法
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:
mysql> CREATE GROUP SEQUENCE seq2 UNIT COUNT 3 INDEX 0; - 執行個體2/庫2:
mysql> CREATE GROUP SEQUENCE seq2 UNIT COUNT 3 INDEX 1; - 執行個體3/庫3:
mysql> CREATE GROUP SEQUENCE seq2 UNIT COUNT 3 INDEX 2;
- 執行個體1/庫1:
- 文法
CREATE TIME SEQUENCE <name>重要 儲存Time-based Sequence值的列必須為BIGINT類型。 - 樣本
7mysql> CREATE TIME SEQUENCE seq3;
- 文法
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參數值。
- 文法
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時,不支援上述參數。
- 文法
ALTER SEQUENCE <name> START WITH <numeric value> - 參數說明
參數 說明 START WITH 單元化Group Sequence的起始值,無預設值,若未指定則忽略該參數。 說明 單元化Group 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時該參數無效。
- 文法
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的不同類型進行轉換時,您需要瞭解如下事項:
- 通過
ALTER SEQUENCE的CHANGE 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類型的縮寫。
- 文法
[<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值的文法如下:
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;