CREATE SEQUENCE
功能描述
在PG兼容模式下,Vastbase G100支持创建临时序列功能,创建的临时序列会在会话退出时删除。
支持使用as data_type语法可选项,指定序列的数据类型。CREATE SEQUENCE完整说明请参考CREATE SEQUENCE。
语法格式
CREATE [ TEMPORARY | TEMP ] SEQUENCE name [as data_type]
[ INCREMENT [ BY ] increment ]
[ MINVALUE minvalue | NO MINVALUE | NOMINVALUE ] [ MAXVALUE maxvalue | NO MAXVALUE | NOMAXVALUE]
[ START [ WITH ] start ] [ CACHE cache ] [ [ NO ] CYCLE | NOCYCLE ]
[ OWNED BY { table_name.column_name | NONE } ];
参数说明
TEMPOPARY/TEMP
如果声明了这个修饰词,那么该序列对象只为这个会话创建,并且在会话结束的时候自动删除。
name
序列的名称。
data_type
序列的数据类型,Vastbase G100支持的数据类型有smallint、integer和bright,其中bright是默认值。
increment
指定序列的步长。一个正数将生成一个递增的序列,一个负数将生成一个递减的序列。缺省值为1。
MINVALUE minvalue | NO MINVALUE| NOMINVALUE
执行序列的最小值。如果没有声明minvalue或者声明了NO MINVALUE,则递增序列的缺省值为1,递减序列的缺省值为-263-1。NOMINVALUE等价于NO MINVALUE。
MAXVALUE maxvalue | NO MAXVALUE| NOMAXVALUE
执行序列的最大值。如果没有声明maxvalue或者声明了NO MAXVALUE,则递增序列的缺省值为263-1,递减序列的缺省值为-1。NOMAXVALUE等价于NO MAXVALUE。
start
指定序列的起始值。缺省值:对于递增序列为minvalue,递减序列为maxvalue。
cache
为了快速访问,而在内存中预先存储序列号的个数。缺省值为1,表示一次只能生成一个值,也就是没有缓存。
不建议同时定义cache和maxvalue或minvalue。因为定义cache后不能保证序列的连续性,可能会产生空洞,造成序列号段浪费。
CYCLE
用于使序列达到maxvalue或者minvalue后可循环并继续下去。
如果声明了NO CYCLE,则在序列达到其最大值后任何对nextval的调用都会返回一个错误。
NOCYCLE的作用等价于NO CYCLE。
缺省值为NO CYCLE。
若定义序列为CYCLE,则不能保证序列的唯一性。
OWNED BY
- 将序列和一个表的指定字段进行关联。这样,在删除那个字段或其所在表的时候会自动删除已关联的序列。关联的表和序列的所有者必须是同一个用户,并且在同一个模式中。需要注意的是,通过指定OWNED BY,仅仅是建立了表的对应列和sequence之间关联关系,并不会在插入数据时在该列上产生自增序列。
- 缺省值为OWNED BY NONE,表示不存在这样的关联。
通过OWNED BY创建的Sequence不建议用于其他表,如果希望多个表共享Sequence,该Sequence不应该从属于特定表。
注意事项
- 该功能仅在数据库兼容模式为PG时能够使用(即创建DB时DBCOMPATIBILITY='PG'),在其他数据库兼容模式下不能使用该特性。
- 用户需要具备创建序列的权限。
- 创建临时序列功能仅支持行存表。
- 创建临时序列功能不支持在高可用场景下使用。
- 不支持在事务块中修改序列的maxvalue。
示例
示例1:创建临时序列。
1、创建数据库my_test,检查兼容性。
CREATE DATABASE my_test DBCOMPATIBILITY 'PG'; \c my_test show sql_compatibility;
2、创建一个名为seq的临时序列,序列的起始值为10。
create temp sequence seq start 10;
3、查看这个序列。
\d seq
返回结果如下,表示可以查询到临时序列的信息。
Sequence "pg_temp__1_2_140135787915008.seq" Column | Type | Value ---------------+---------+--------------------- sequence_name | name | seq last_value | bigint | 10 start_value | bigint | 10 increment_by | bigint | 1 max_value | bigint | 9223372036854775807 min_value | bigint | 1 cache_value | bigint | 1 log_cnt | bigint | 0 is_cycled | boolean | f is_called | boolean | f uuid | bigint | 0 type_id | oid | 20
4、退出当前会话,进入新会话,查询seq序列。
\d seq
返回结果如下,显示没有序列seq。
Did not find any relation named "seq".
示例2:创建数据类型为smallint的序列。
1、创建并切换至兼容模式为PG的数据库下。
CREATE DATABASE test_10379 DBCOMPATIBILITY 'PG'; \c test_10379
2、创建一个名为serial1的递增序列,从101开始,并指定data_type类型为smallint。
create sequence serial1 as smallint start 101;
3、查看这个序列。
select * from serial1;
返回结果为:
sequence_name | last_value | start_value | increment_by | max_value | min_value | cache_value | log_cnt | is_cycled | is_called | uuid | type_id ---------------+------------+-------------+--------------+-----------+---------- -+-------------+---------+-----------+-----------+------+--------- serial1 | 101 | 101 | 1 | 32767 | 1 | 1 | 0 | f | f | 0 | 21 (1 row)