【Oracle11g】13_序列

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                                        小张

【Oracle11g】13_序列

上一篇:[SQL]给定数字的频率查询中位数


下一篇:【MySQL 主从同步延迟的原因及解决办法】