序列值
📄字数 3.8K
👁️阅读量 加载中...
序列值主要用于产生整数序列值,其产生整数值按照用户指定规则进行递增或递减。创建完成后也可以使用函数 nextval、currval 对序列值进行操作。
一、创建序列值
1.1 语法格式
1.2 参数说明
IF NOT EXISTS
:创建序列值时若同名序列值存在则忽略错误,不会影响已存在序列值。schema_name
:模式名,默认为当前模式。seq_name
: 序列值名称,名称必须满足数据库对象命名规则中列出的要求。SequenceOption
:可选的序列值表达式,用来指定序列值的最小值、最大值、起始值、增长步长、缓存数量等选项。COMMENT comment_str
:可选的序列值注释信息。START WITH var_value
:var_value
为序列的初始值。如果序列递增,未指定初始值,则初始值为最小值;如果序列递减,未指定初始值,则初始值为最大值。[CACHE var_value | NOCACHE]
:CACHE | NOCACHE
:是否在缓存中。value
是缓存序列值个数,代表要预分配并存储在内存中的序列号数量,以便更快地访问,最小值为1(一次只能生成一个值,即无缓存),同时也是默认值。- 若系统重启,未使用的缓存序列值将丢失,序列值起始值将变为cache后的下一个值。
- 集群环境下,多节点使用同一个序列值,并且设置cache大于1,那么节点与节点之间使用序列值不连续,如cache设置为10,当前工作节点1使用序列号(1-10),若此时在工作节点2使用序列值则序列号为(11-20),节点2序列值的起始值为节点1的cache后的下一个值,其他工作节点使用起始值依此类推。
[CYCLE | NOCYCLE]
:序列值达到最大值后是否循环。如果不循环,达到最大值后,继续产生新值会发生错误;默认不循环。INCREMENT BY var_value
:var_value
为序列步长(序列增加的幅度),默认为1。如果是负则按此步长递减。[MAXVALUE var_value | NOMAXVALUE ]
:指定序列可以生成的最大值。NOMAXVALUE是默认选项,对于递增序列,NOMAXVALUE意味着最大值是9223372036854775807,对于递减序列,最大值是-1。[MINVALUE var_value | NOMINVALUE ]
:指定序列可以生成的最小值。NOMINVALUE是默认选项,对于递增序列,NOMINVALUE意味着最小值是1,对于递减序列,最小值是-9223372036854775808。
提示
在高并发情况下,可以设置cache数量,减少数据库内部的磁盘交互,从而达到快速获取的目的。
在集群模式下,若需要各个工作节点的序列值连续同步,需将cache设置为1。
序列值的相关权限具体请参考 权限管理。
1.3 示例
示例1
创建一个名为seq_1的序列值,该序列值最小值为1,最大值为1000,起始值为100,步长为1。
sqlSQL> CREATE SEQUENCE seq_1 MINVALUE 1 MAXVALUE 1000 START WITH 100 INCREMENT BY 1;
示例2
创建一个与原序列值名称相同但最大值属性不同的序列值,不会影响原序列值,会存在警告。
sql-- 创建seq_2 SQL> CREATE SEQUENCE IF NOT EXISTS seq_2 MAXVALUE 1000; -- 创建同名seq_2 SQL> CREATE SEQUENCE IF NOT EXISTS seq_2 MAXVALUE 500; Warning: [E9005] 同名对象SEQ_2已存在 -- 查询seq_2,不会影响seq_2属性 SQL> SELECT ds.seq_name,ds.max_val FROM dba_sequences ds WHERE ds.seq_name='SEQ_2'; +----------+---------+ | SEQ_NAME | MAX_VAL | +----------+---------+ | SEQ_2 | 1000 | +----------+---------+
二、修改序列值
2.1 语法格式
序列值修改语法中的各参数含义与创建序列值一致,可以对序列值的最小值、最大值、起始值、增长步长、缓存数量进行修改。
2.2 参数说明
2.3 示例
示例
创建序列值后,对最小值、最大值、增长步长、缓存数量、是否循环属性进行修改。
sql-- 创建序列值 SQL> CREATE SEQUENCE seq_test MINVALUE 1 MAXVALUE 1000 START WITH 100 CACHE 10 INCREMENT BY 1; SQL> SELECT seq_name, min_val,max_val,step_val,is_cycle,cache_val FROM dba_sequences ds WHERE ds.seq_name='seq_test'; +----------+---------+---------+----------+----------+-----------+ | SEQ_NAME | MIN_VAL | MAX_VAL | STEP_VAL | IS_CYCLE | CACHE_VAL | +----------+---------+---------+----------+----------+-----------+ | SEQ_TEST | 1 | 1000 | 1 | F | 10 | +----------+---------+---------+----------+----------+-----------+ -- 修改序列值最小值、最大值、增长步长、缓存数量、是否循环。 SQL> ALTER SEQUENCE seq_test MINVALUE 5 MAXVALUE 500 INCREMENT BY 5 CACHE 20 CYCLE; SQL> SELECT seq_name, min_val,max_val,step_val,is_cycle,cache_val FROM dba_sequences ds WHERE ds.seq_name='seq_test'; +----------+---------+---------+----------+----------+-----------+ | SEQ_NAME | MIN_VAL | MAX_VAL | STEP_VAL | IS_CYCLE | CACHE_VAL | +----------+---------+---------+----------+----------+-----------+ | SEQ_TEST | 5 | 500 | 5 | T | 20 | +----------+---------+---------+----------+----------+-----------+
三、使用序列值
3.1 NEXTVAL
将序列值前进到其下一个值并返回该值,创建序列值后,连续调用NEXTVAL可以获取从起始值开始连续的值。
示例
创建序列值后,使用NEXTVAL。
sql-- 创建序列值 SQL> CREATE SEQUENCE seq_test2 MINVALUE 1 MAXVALUE 1000 START WITH 100 INCREMENT BY 1; -- 获取序列的下一个值 SQL> SELECT seq_test2.NEXTVAL FROM DUAL; +-------+ | EXPR1 | +-------+ | 100 | +-------+
3.2 CURRVAL
获取序列的当前值,CURRVAL
返回的是当前会话中最近一次通过NEXTVAL
获取的序列值。如果在调用NEXTVAL
之前尝试使用CURRVAL
则会报错,因为此时NEXTVAL
未获取序列值,导致CURRVAL
没有可以访问的序列值。
示例
sql-- 创建序列值 SQL> CREATE SEQUENCE seq_test3 MINVALUE 1 MAXVALUE 1000 START WITH 100 INCREMENT BY 1; -- 第一次尝试使用CURRVAL SQL> SELECT CURRVAL('seq_test3') FROM DUAL; Error: [E7019 L1 C8] 当前会话中序列值seq_test3.CURRVAL不可用 -- 调用NEXTVAL SQL> SELECT seq_test3.NEXTVAL FROM DUAL; +-------+ | EXPR1 | +-------+ | 100 | +-------+ -- 再次尝试使用CURRVAL SQL> SELECT CURRVAL('seq_test3') FROM DUAL; +-------+ | EXPR1 | +-------+ | 100 | +-------+
注意
- CURRVAL的生命周期:仅存在于会话中,且每个会话之间独立。
四、删除序列值
4.1 语法格式
4.2 参数说明
IF EXISTS
:删除序列值时序列值不存在则忽略此错误。schema_name
:模式名,默认为当前模式。seq_name
: 序列值名称,名称必须满足数据库对象命名规则中列出的要求,。CASCADE | RESTRICT
:存在依赖序列值的对象时,是否强制删除序列值,CASCADE为强制删除(序列值为字段默认值时,不允许强制删除),默认为RESTRICT删除时报错。
4.3 示例
示例
删除序列值,序列值为表的默认字段。
sql-- 先创建一个序列值 SQL> CREATE SEQUENCE seq_test4 MINVALUE 1 MAXVALUE 1000 START WITH 100 INCREMENT BY 1; -- 创建表,序列值作为字段默认值 SQL> CREATE TABLE tab_1 (col_1 int DEFAULT seq_test4.NEXTVAL); -- RESTRICT删除 SQL> DROP SEQUENCE seq_test4; Error: [E7008] 存在对序列值SEQ_TEST4依赖的对象 -- CASCADE删除(序列值为字段默认值不允许删除) SQL> DROP SEQUENCE seq_test4 CASCADE; Error: [E7008] 存在对序列值SEQ_TEST4依赖的对象 -- 更改表的默认值 SQL> ALTER TABLE tab_1 ALTER COLUMN col_1 DEFAULT 1; -- 删除序列值成功 SQL> DROP SEQUENCE seq_test4;