oracle序列
序列是一个数据库对象,多个用户可以从中生成唯一的整数。您可以使用序列自动生成主键值 ,生成序列号时,序列会递增,与事务提交或回滚无关。 如果两个用户同时递增相同的序列,则每个用户获取的序列号可能有间隙,因为序列号是由另一个用户生成的。一个用户永远无法获取另一个用户生成的序列号。 在由一个用户生成序列值之后,该用户可以继续访问该值,而不管该序列是否由另一个用户递增。
序列号是独立于表生成的,因此相同的序列可用于一个或多个表。单个序列号可能会被跳过,因为它们是在最终回滚的事务中生成和使用的。另外,单个用户可能没有意识到其他用户正在从相同的序列中绘制。 创建序列后,可以在SQL语句中使用CURRVAL
伪列访问其值,该伪列返回序列的当前值,或NEXTVAL
伪列,它会递增序列并返回新值。
必备条件
-
具有创建序列的权限
-
要在另一个用户的架构中创建序列,您必须具有
CREATE
ANY
SEQUENCE
系统权限。
创建序列
语法
CREATE SEQUENCE [ schema. ] sequence
[ { INCREMENT BY | START WITH } integer
| { MAXVALUE integer | NOMAXVALUE }
| { MINVALUE integer | NOMINVALUE }
| { CYCLE | NOCYCLE }
| { CACHE integer | NOCACHE }
| { ORDER | NOORDER }
]...
;
实验过程
使用system用户登录,创建一个表空间(下面的datafile文件路径必须确保有文件夹)
创建表空间
create tablespace tbsp_test
datafile 'G:/oracle/tablespace/tbsp_test.dbf'
size 50M autoextend off;
创建用户
create User u_test
identified by 111111
default tablespace tbsp_test;
授予resource角色
grant resource to u_test;
授予session权限
grang create session to u_test;
使用u_test登录
discon;
connect u_test/111111;
创建一个序列
create sequence u_test_emp_sequence
increment by 5
maxvalue 1000
minvalue 10
nocycle
cache 30
order;
解释
- increment 每次增长的值
- maxvalue 最大值
- minvalue 最小值
- nocycle 不循环
- cache 缓存序列个数
- order 有序的
使用序列
select u_test_emp_sequence.CURRVAL from dual;
错误记录
ORA-08002: 序列 U_TEST_EMP_SEQUENCE.CURRVAL 尚未在此会话中定义。
这是因为在一个新的会话中,序列需要初始化 。
select u_test_emp_sequence.nextval from dual; -- 结果为10
起始值为5所以下一个为5.
在查询一次就成为了15了。
此时再使用
select u_test_emp_sequence.CURRVAL from dual;-- 现在可以得到15了
修改序列
修改最大值
alter sequence u_test_emp_sequence
maxvalue 30;
当我们修改为30之后,再使用查询下一个序列执行几次之后,序列将被消耗完毕,再查询,就会出现序列无法实例化。
同时修改多个参数值
alter sequence u_test_emp_sequence
increment by 2
maxvalue 60 minvalue -5
cycle
cache 5;
此时序列满了之后,他将会重新循环,注意,cache不能大于cycle的数量。
比如最小值5,最大值18,步数为2,也就是说其中最多可用的数量为6,那么cahce数量就不能超过6.
删除序列
drop sequence u_test_emp_sequence;