1.序列的定义
序列是用于生成唯一,连续序号的对象。序列可以是升序的,也可以是降序的
2.创建序列
CREATE SEQUENCE stu_seq
START WITH 1 -- 指定第一个序号从 1 开始
INCREMENT BY 1 -- 指定序号之间的间隔为 1
MAXVALUE 2000 -- 表示序列的最大值为 2000
MINVALUE 1 -- 表示序列的最小值为 1
NOCYCLE -- 在达到最大值后停止生成下一个值
CACHE 10; -- 指定内存中预先分配的序号数
上述参数中,重点解释下CACHE 10,该参数的意思是:例如,现在获取的序列号是6,那么Oracle直接将6-16全部计算出来,存储到内存中,当前先把6返回,当下次再取7或者8等数字的时候,Oracle直接返回,这样效率比较高。所以CACHE就表示在内存预先储存多少个值
小提示:Oracle创建sequence的时候,如果不指定cache,那么默认的cache是20
3.查询某个用户是否有创建sequence的权限
-- 使用scott登录
SQL> conn scott/tiger@orcl
-- 查询scott用户所属角色
SQL> select u.username,u.granted_role from user_role_privs u;
USERNAME GRANTED_ROLE
------------------------------ ------------------------------
SCOTT CONNECT
SCOTT RESOURCE
-- 查看当前角色下所有的权限
SQL> select * from role_sys_privs;
ROLE PRIVILEGE ADMIN_OPTION
------------------------------ ---------------------------------------- ------------
RESOURCE CREATE SEQUENCE NO
RESOURCE CREATE TRIGGER NO
RESOURCE CREATE CLUSTER NO
RESOURCE CREATE PROCEDURE NO
RESOURCE CREATE TYPE NO
CONNECT CREATE SESSION NO
RESOURCE CREATE OPERATOR NO
RESOURCE CREATE TABLE NO
RESOURCE CREATE INDEXTYPE NO
9 rows selected
--
从上述结果可以可以看出scott用户拥有CREATE SEQUENCE的权限
4.查询创建的序列
SQL> select * from user_sequences;
5.创建降序序列
create sequence seq1 start with 1000 increment by -1 maxvalue 1000;
6.访问序列的值
通过序列的伪列来访问序列的值
- NEXTVAL 返回序列的下一个值
- CURRVAL 返回序列的当前值
第一次使用序列中的值的时候,要使用NEXTVAL
实战演练
SQL> select seq1.nextval from dual; -- 第一次执行
NEXTVAL
----------
1000
SQL> select seq1.nextval from dual; -- 第二次执行
NEXTVAL
----------
999
7.修改序列
使用ALTER SEQUENCE语句修改序列,不能更改序列的START WITH参数
ALTER SEQUENCE stu_seq MAXVALUE 5000 CYCLE;
8.删除序列
使用DROP SEQUENCE语句删除序列
DROP SEQUENCE stu_seq;
9.实战案例:自定义自增长字段
现在有学生表,有学生ID,学生名字,现在需要将ID自定义为A202004开头,并且从01、02...逐渐自增,示例如下:
第一个学生:A20200401
第二个学生:A20200402
...
第99个学生:A20200499
示例代码:
SQL> create sequence seq_for_stu start with 1 increment by 1 maxvalue 99;
Sequence created
SQL> create table stu(id varchar(100),name varchar2(100));
Table created
SQL> insert into stu values('A202004'||to_char(seq_for_stu.nextval,'09MI'),'小明');
1 row inserted
SQL> insert into stu values('A202004'||to_char(seq_for_stu.nextval,'09MI'),'小红');
1 row inserted
SQL> insert into stu values('A202004'||to_char(seq_for_stu.nextval,'09MI'),'小张');
1 row inserted
SQL> commit;
Commit complete
SQL> SELECT * FROM stu;
ID NAME
------------------------------------------------ ---------------
A20200401 小明
A20200402 小红
A20200403 小张