TDSQL MySQL版 Sequence

关键字 Sequence 语法和 MariaDB/Oracle 兼容,但是保证分布式全局递增且唯一,具体使用如下。

相关产品
TDSQL MySQL版 产品页,含版本规格、价格与购买入口。

·TDSQL_INCREMENT BY 设置序列步长,正数表示升序序列,负数表示降序序列。设置值必须在序列最大值与最小值之间,缺省则默认1。

·START WITH 设置序列起始值,缺省则默认序列最小值。

·TDSQL_MAXVALUE 和 TDSQL_NOMAXVALUE 设置序列最大值,TDSQL_MAXVALUE 缺省或者设置TDSQL_NOMAXVALUE 时,递增序列最大值为9223372036854775807,递减序列最大值为-1。

·TDSQL_MINVALUE 和 TDSQL_NOMINVALUE 设置序列最小 TDSQL_MINVALUE 缺省或者设置TDSQL_NOMINVALUE 时,递增序列最小值为1,递减序列最小值为-9223372036854775808。

·TDSQL_CYCLE 和 TDSQL_NOCYCLE 设置序列是否循环,缺省默认不循环。

·TDSQL_CACHE 和 TDSQL_NOCACHE 设置缓存序列数量,缺省默认缓存20。

·TDSQL_ORDER 和 TDSQL_NOORDER。设置序列对于并发请求保证完全有序。TDSQL 目前仅支持无序。

注意:说明:

创建序列需要 CREATE SEQUENCE 系统权限。序列的创建语法如下:

CREATE TDSQL_SEQUENCE 序列名 [START WITH n] [{TDSQL_MINVALUE | TDSQL_MAXVALUE} n | TDSQL_NOMINVALUE | TDSQL_NOMAXVALUE] [TDSQL_INCREMENT BY n] [{TDSQL_CYCLE|TDSQL_NOCYCLE}] [{TDSQL_CACHE|TDSQL_NOCACHE} n]

一、创建 Sequence

create tdsql_sequence test.s1 start with 12 tdsql_minvalue 10 maxvalue 50000 tdsql_increment by 5 tdsql_nocyclecreate tdsql_sequence test.s2 start with 12 tdsql_minvalue 10 maxvalue 50000 tdsql_increment by 1 tdsql_cycle

·以上 SQL 语句包含开始值、最小值、最大值、步长、缓存大小及是否回绕6个参数。

·参数默认值,开始值(1)、最小值(1)、最大值(LONGLONG_MAX-1)、步长(1)、是否回绕(0)。

二、删除 Sequence

drop tdsql_sequence test.s1

三、查询 Sequence

show create tdsql_sequence test.s1

四、使用 Sequence 获取下一个数值

select tdsql_nextval(test.s2)select next value for test.s2

mysql> select tdsql_nextval(test.s1);+—-+| 12 |+—-+| 12 |+—-+1 row in set (0.18 sec)mysql> select tdsql_nextval(test.s2);+—-+| 12 |+—-+| 12 |+—-+1 row in set (0.13 sec)mysql> select tdsql_nextval(test.s1);+—-+| 17 |+—-+| 17 |+—-+1 row in set (0.01 sec)mysql> select tdsql_nextval(test.s2);+—-+| 13 |+—-+| 13 |+—-+1 row in set (0.00 sec)mysql> select next value for test.s1;+—-+| 22 |+—-+| 22 |+—-+1 row in set (0.01 sec)

五、nextval 可以用在 insert 等地方

mysql> create database test;Query OK, 0 rows affected (0.29 sec)mysql> create table test.t1 (a int, b int, PRIMARY KEY (b));Query OK, 0 rows affected (0.15 sec)mysql> insert into test.t1(a,b) values(11,2);Query OK, 1 row affected (0.03 sec)mysql> select * from test.t1;+—-+——+| a | b |+—-+——+| 11 | 2 |+—-+——+1 row in set (0.00 sec)mysql> insert into test.t1(a,b) values(tdsql_nextval(test.s2),3);Query OK, 1 row affected (0.01 sec)mysql> select * from test.t1;+—-+——+| a | b |+—-+——+| 11 | 2 || 14 | 3 |+—-+——+2 rows in set (0.00 sec)

如需获取上一次的值以连接相关数据:如果之前没有用 nextval 命令获取过数据,数值将返回为0。

select tdsql_lastval(test.s1)select tdsql_previous value for test.s1;

mysql> select tdsql_lastval(test.s1);+—-+| 22 |+—-+| 22 |+—-+1 row in set (0.00 sec)mysql> select tdsql_previous value for test.s1;+—-+| 22 |+—-+| 22 |+—-+1 row in set (0.00 sec)

设置下一个序列数值,只能比当前数值大,否则将返回数值为0。

select tdsql_setval(test.s2,1000,bool use) // use 默认为1,表示1000这个值用过了,下一次不包含1000,如果为0,则下一个从1000开始。

设置下一个序列数值时,如果比当前数值小,则设置不生效。

mysql> select tdsql_nextval(test.s2);+—-+| 15 |+—-+| 15 |+—-+1 row in set (0.01 sec)mysql> select tdsql_setval(test.s2,10);+—+| 0 |+—+| 0 |+—+1 row in set (0.03 sec)mysql> select tdsql_nextval(test.s2);+—-+| 16 |+—-+| 16 |+—-+

如果比当前数值大,成功返回当前设置的值。

mysql> select tdsql_setval(test.s2,20);+—-+| 20 |+—-+| 20 |+—-+1 row in set (0.02 sec)mysql> select tdsql_nextval(test.s2);+—-+| 21 |+—-+| 21 |+—-+1 row in set (0.01 sec)

强制设置下一个序列数值,允许设置比当前数值小的值。

select tdsql_resetval(test.s2,1000)

如果强制设置成功,返回当前设置的值,下一个序列数值从该值开始。

mysql> select tdsql_resetval(test.s2,14);+—-+| 14 |+—-+| 14 |+—-+1 row in set (0.00 sec)mysql> select tdsql_nextval(test.s2);+—-+| 14 |+—-+| 14 |+—-+1 row in set (0.01 sec)

需要注意,Sequence 的部分关键字以 TDSQL_ 前缀开始:

注意:说明:

注意:若已打开 oldstyle 配置项,proxy 将兼容标准 Sequence 关键字,即关键字前可不添加TDSQL_ 前缀。

TDSQL_CYCLE TDSQL_INCREMENT TDSQL_LASTVAL TDSQL_MINVALUE TDSQL_NEXTVAL TDSQL_NOCACHE TDSQL_NOCYCLE TDSQL_NOMAXVALUE TDSQL_NOMINVALUE TDSQL_PREVIOUS TDSQL_RESTART TDSQL_REUSE TDSQL_SEQUENCE TDSQL_SETVAL

赞 (0)
上一篇 4天前
下一篇 4天前