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