CREATE SEQUENCE¶
说明¶
定义一个新的序列发生器
语法¶
create_sequence ::=
start_option ::=
increment_option ::=
maxvalue_option ::=
minvalue_option ::=
cycle_option ::=
cache_option ::=
binlog_option ::=
order_option ::=
参数¶
GLOBAL TEMPORARY
该功能暂未支持
该参数定义全局级临时序列发生器。
该序列发生器在服务器下次启动时自动删除。
LOCAL TEMPORARY
该参数定义会话级临时序列发生器。
该序列发生器在用户退出结束本次会话时自动删除。
创建临时序列发生器,缺省时使用该参数。
seqname
新定义的序列名,同一模式下,表、索引、视图、序列不能同名。
increment
序列每次增长数。
使用正数序列递增,使用负数序列递减。
缺省时使用1。不允许使用0。
minvalue
NO MINVALUE
序列可生成的最小值。
如果没有声明这个子句或者声明了NO MINVALUE,那么就使用缺省值。缺省值递增序列为1,递减序列为-9223372036854775808。
maxvalue
NO MAXVALUE
序列可生成的最大值。
如果没有声明这个子句或者声明了NO MAXVALUE,那么就使用缺省值。缺省值递增序列为9223372036854775807,递减序列为-1。
start
序列初始值。
缺省时递增序列为 minvalue,递减序列为 maxvalue。
cache
可以缓存多少个序列号。
此时序列号可以从存放在内存中的已预分配的序列号中获取。使用完已预分配的序列号后,系统自动再次获取预分配序列号。
使用该参数可加快序列号分配速度,但可能会造成序列号不连续。
缺省时是1。即不进行预分配。
NO CACHE
不进行预分配。相当于CACHE 1。
BINLOG ON/OFF
如果BINLOG的参数为ON,表示记录该序列的二进制日志。如果BINLOG的参数为OFF,则不记录该序列的二进制日志。
CYCLE
NO CYCLE
CYCLE参数使序列号达到最大值(序列递增)或最小值(序列递减)时可复位并继续下去。
序列号达到最大值时,生成的下一个数据将分别是最小值(序列递增)或最大值(序列递减)。
如果指定NO CYCLE,那么在到达最大值后再获取下一序列号时将返回错误。
如果CYCLE和NO CYCLE都没有指定,缺省为NO CYCLE。
ORDER
该参数选项暂未实现,使用时将被忽略。
注解
序列是基于 bigint 运算的,因此其范围不能超过八字节的整数范围(-9223372036854775808 到 9223372036854775807)。
序列创建后,可以使用函数 nextval、currval 和 setval 对序列进行操作。注意:在使用函数currval查看当前序列值之前,必须先使用nextval或setval对序列进行初始化,否则系统将会报错。
同一类参数不能重复出现,例如不能同时指定CYCLE和NO CYCLE两个参数,也不能指定START两次。
用户在需要获得不能重复值,比如需要生成订单号时,可以利用序列来得到一个唯一值。
用户可以在创建表的时候用serial类型或者bigserial类型。
serial和bigserial类型不是真正的类型,只是为在表中设置唯一标识做的概念上的便利.在目前的实现中,下面一句话:
CREATE TABLE tablename (
colname SERIAL
);
等价于声明下面几句话:
CREATE SEQUENCE tablename_colname_seq;
CREATE TABLE tablename(
colname integer DEFAULT nextval('tablename_colname_seq') UNIQUE NOT NULL
);
因此,我们就创建了一个整数字段并且把它的缺省数值安排为从一个序列发生器取值。还应用了 UNIQUE 和 NOT NULL 约束以确保明确地插入的数值也不会重复。
类型名serial创建integer字段.类型名bigserial创建一个 bigint 字段.
serial类型对应的序列(tablename_colname_seq),可以设置缓存。神通提供配置参数SERIAL_CACHE_SIZE来控制serial类型 对应序列的缓存大小,参数配置范围为0~2147483647,默认值为0,表示NO CACHE。此参数不影响显示创建的序列的缓存大小。
示例¶
示例1: 创建递增序列(使用默认选项)
-- 清理环境
DROP SEQUENCE seq1 CASCADE;
-- 创建序列
CREATE SEQUENCE seq1;
-- 使用 CURRVAL 获取未初始化的序列当前值,报错
SELECT CURRVAL('seq1');
ERROR, 当前SESSION还没有得到序列的当前值, 请先调用nextval或者setval,序列名为SEQ1
-- 使用 NEXVAL 初始化序列
SELECT NEXTVAL('seq1');
NEXTVAL(bigint) |
---------------------
1 |
总数目:1
-- 序列已初始化,CURRVAL 不报错
SELECT CURRVAL('seq1');
CURRVAL(bigint) |
---------------------
1 |
总数目:1
-- 删除序列
DROP SEQUENCE seq1;
示例2: 创建递增序列(指定初始值)
-- 清理环境
DROP SEQUENCE seq2 CASCADE;
-- 创建序列
CREATE SEQUENCE seq2 START WITH 101;
-- 使用 NEXVAL 初始化序列
SELECT NEXTVAL('seq2');
NEXTVAL(bigint) |
---------------------
101 |
总数目:1
-- 起始值是 101
SELECT CURRVAL('seq2');
CURRVAL(bigint) |
---------------------
101 |
总数目:1
-- 删除序列
DROP SEQUENCE seq2;
示例3: 使用序列(用于确保数据唯一性)
-- 清理环境
DROP TABLE tab3 CASCADE;
DROP SEQUENCE seq3 CASCADE;
-- 创建表
CREATE TABLE tab3(id INT);
-- 创建序列
CREATE SEQUENCE seq3;
-- 使用序列确保插入表中数据唯一性
INSERT INTO tab3 VALUES (NEXTVAL('seq3'));
INSERT INTO tab3 VALUES (NEXTVAL('seq3'));
INSERT INTO tab3 VALUES (NEXTVAL('seq3'));
-- 查询表中数据
SELECT * FROM tab3 ORDER BY id;
ID(int) |
-------------
1 |
-------------
2 |
-------------
3 |
总数目:3
-- 删除表和序列
DROP TABLE tab3;
DROP SEQUENCE seq3;
示例4: 设置序列值
-- 清理环境
DROP SEQUENCE seq4 CASCADE;
-- 创建序列
CREATE SEQUENCE seq4;
SELECT NEXTVAL('seq4');
NEXTVAL(bigint) |
---------------------
1 |
总数目:1
SELECT NEXTVAL('seq4');
NEXTVAL(bigint) |
---------------------
2 |
总数目:1
SELECT NEXTVAL('seq4');
NEXTVAL(bigint) |
---------------------
3 |
总数目:1
SELECT NEXTVAL('seq4');
NEXTVAL(bigint) |
---------------------
4 |
总数目:1
-- 设置序列
SELECT SETVAL('seq4', 20);
SETVAL(bigint) |
--------------------
20 |
总数目:1
SELECT NEXTVAL('seq4');
NEXTVAL(bigint) |
---------------------
21 |
总数目:1
SELECT NEXTVAL('seq4');
NEXTVAL(bigint) |
---------------------
22 |
总数目:1
SELECT NEXTVAL('seq4');
NEXTVAL(bigint) |
---------------------
23 |
总数目:1
SELECT NEXTVAL('seq4');
NEXTVAL(bigint) |
---------------------
24 |
总数目:1
-- 删除序列
DROP SEQUENCE seq4;
示例5: 设置serial类型缓存大小
-- 清理环境
DROP TABLE tab1 CASCADE;
DROP SEQUENCE tab1_id_seq CASCADE;
DROP SEQUENCE seq5 CASCADE;
DROP SEQUENCE seq6 CASCADE;
RESET ALL;
--默认为0,表示NO CACHE
SHOW SERIAL_CACHE_SIZE;
name(text) |setting(text) |
-----------------------------------
SERIAL_CACHE_SIZ|0 |
E | |
总数目:1
--tab1对应的序列为 TAB1_ID_SEQ
CREATE TABLE tab1(id serial, b int);
CREATE SEQUENCE seq5 NO CACHE;
CREATE SEQUENCE seq6 CACHE 100;
-- 此时serial_cache_size = 0, serial类型对应的序列与seq5的cache size一致
SELECT SEQUENCE_NAME, CACHE_SIZE FROM ALL_SEQUENCES WHERE SEQUENCE_NAME IN ('TAB1_ID_SEQ', 'SEQ5', 'SEQ6');
SEQUENCE_NAME(varchar) |CACHE_SIZE(numeric) |
-----------------------------------------------------
TAB1_ID_SEQ |1 |
-----------------------------------------------------
SEQ5 |1 |
-----------------------------------------------------
SEQ6 |100 |
总数目:3
DROP TABLE tab1 CASCADE;
DROP SEQUENCE seq5;
DROP SEQUENCE seq6;
SET SERIAL_CACHE_SIZE = 1000;
SHOW SERIAL_CACHE_SIZE;
name(text) |setting(text) |
-----------------------------------
SERIAL_CACHE_SIZ|1000 |
E | |
总数目:1
--tab1对应的序列为 TAB1_ID_SEQ
CREATE TABLE tab1(id serial, b int);
CREATE SEQUENCE seq5;
CREATE SEQUENCE seq6 CACHE 100;
--参数SERIAL_CACHE_SIZE只影响serial类型对应的序列,不影响显示创建的序列
SELECT SEQUENCE_NAME, CACHE_SIZE FROM ALL_SEQUENCES WHERE SEQUENCE_NAME IN ('TAB1_ID_SEQ', 'SEQ5', 'SEQ6');
SEQUENCE_NAME(varchar) |CACHE_SIZE(numeric) |
-----------------------------------------------------
TAB1_ID_SEQ |1000 |
-----------------------------------------------------
SEQ5 |1 |
-----------------------------------------------------
SEQ6 |100 |
总数目:3
DROP TABLE tab1 CASCADE;
DROP SEQUENCE seq5;
DROP SEQUENCE seq6;
示例6: 创建一个带BINLOG属性的序列
--创建一个开启了BINLOG的序列seq7
CREATE SEQUENCE seq7 BINLOG ON;
--创建一个未开启BINLOG的序列seq8
CREATE SEQUENCE seq8 BINLOG OFF;