15.7.1 全局序列概述
全局序列主要指基于DB的全局序列。
说明
● 支持修改自增序列初始值。
● 全局序列主要保证ID全局唯一,并不能保证一定是连续递增的。
表15-31 全局序列支持的表类型
表类型 拆分表 广播表 单表
基于DB的全局序列 支持 支持 不支持
创建自增序列
步骤1 使用客户端连接DDM实例。
步骤2 连接成功后,打开目标逻辑库。
步骤3 输入命令创建自增序列。
create sequence xxxxx ;
说明
● xxxxx代表序列名。
● 建议使用bigint型作为自增键的数据类型。tinyint、smallint、mediumint、integer、int数 据类型不建议作为自增键的类型,容易越界造成值重复。
----结束
删除自增序列
步骤1 使用客户端连接DDM实例。
步骤2 连接成功后,打开目标逻辑库。
步骤3 输入命令“show sequences”查看所有序列。
步骤4 输入命令删除序列。
drop sequence xxxxx ; drop sequence DB.xxx;
说明
● 对大小写不敏感。
● 如果序列属于某张表格(即创建这张表时有一列是自增列),不允许删除。
----结束
修改自增序列初始值
步骤1 使用客户端连接DDM实例。
步骤2 连接成功后,打开目标逻辑库。
步骤3 输入“show sequences”查看所有序列。
步骤4 输入命令修改序列起始值。
alter sequence xxxxx START WITH yyyyy;
说明
● xxxxx代表序列名。
● yyyyy代表目标序列起始值。
----结束
查询自增序列
步骤1 使用客户端连接DDM实例。
步骤2 连接成功后,打开目标逻辑库。
步骤3 输入命令“show sequences”查看所有序列。
show sequences;
----结束
修改自增序列 Cache
须知
该功能仅支持内核3.0.3以上的版本。
步骤1 使用客户端连接DDM实例。
步骤2 连接成功后,打开目标逻辑库。
步骤3 输入命令“alter sequence test cache 5000”,修改表test的全局序列的cache值。
步骤4 输入命令“show sequences”,查看test序列的INCREMENT值即是cache值。
----结束
刷新实例所有表自增序列
须知
该功能仅支持内核3.0.4.1以上的版本。
步骤1 使用客户端连接DDM实例。
步骤2 输入命令“fresh all sequence start value”,更改所有逻辑库的所有Sequence。
----结束
15.7.2 nextval、currval 在全局序列的使用
● nextval返回下一个序列值,currval返回当前序列值。其中nextval可以通过 nextval(n)返回n个唯一序列值。
● nextval(n)只能单独用在select sequence.nextval(n)场景下并且不支持跨库操作。
● currval不支持currval(n)的用法。
操作步骤
步骤1 使用客户端连接DDM实例。
步骤2 连接成功后,打开目标逻辑库。
步骤3 输入命令创建全局序列。
create sequence seq_test;
步骤4 输入命令,返回下一个序列值。
select seq_test.nextval;
步骤5 输入命令,获取当前序列值。
select seq_test.currval;
步骤6 输入命令,批量获取序列值。
select seq_test.nextval(n);
说明
● 批量获取序列值场景不支持跨库操作。
● 未使用过全局序列时,currval的返回值是0。
----结束
15.7.3 全局序列在 INSERT 或 REPLACE 语句中的使用
要想在同一个实例下实现跨逻辑库序列的全局唯一,可以在insert语句或者replace语句 中结合全局序列一起使用。Insert语句和replace语句支持nextval和currval两个方式序 列的获取。其中,nextval表示返回下一个序列值,currval表示返回当前序列值。
可以通过schema.seq.nextval、schema.seq.currval使用,如果不指定schema,默认是 当前连接schema下的全局序列。
支持并发获取全局序列,在多session下并发通过schema.seq.nextval获取全局序列能 够产生唯一值。
用法举例
两个逻辑库dml_test_1、dml_test_2,里面都有表test_seq。
表定义
表定义方法:create table test_seq(col1 bigint,col2 bigint) dbpartition by hash(col1)。
操作步骤
步骤1 使用客户端连接DDM实例。
步骤2 连接成功后,打开目标逻辑库。
步骤3 在库级别下,输入命令创建全局序列。
use dml_test_1;
create sequence seq_test;
步骤4 使用以下语句,实现全局序列在insert语句或者replace语句的使用。
● use dml_test_1;
insert into test_seq(col1,col2)values(seq_test.nextval,seq_test.currval);
● use dml_test_2;
insert into
test_seq(col1,col2)values(dml_test_1.seq_test.nextval,dml_test_1.seq_test.curr val);
由于全局序列是创建在逻辑库dml_test_1下的,在逻辑库dml_test_2下使用全局序列 需要显式指定逻辑库dml_test_1.seq_test.nextval、dml_test_1.seq_test.currval。
说明
● 全局序列结合insert和replace的使用只支持拆分表,不支持广播表和单表。
● nextval和currval在insert和replace语句中是从左到右执行的,如果一条语句使用同一个全局 序列nextval多次,每出现一次就递增一次。
● 全局序列是属于逻辑库的,删除逻辑库,所在删除逻辑库的全局序列也会被删除。
----结束