Oracle笔记之序列(Sequence)

时间:2021-12-13 16:19:09

Oracle中序列是一种数据对象,可以视为一个等差数列,我们自增就是一个遍历这个数列的过程,可以取当前值,也可以将当前值自加n后返回,Sequence与表没有太大的关系,有的时候如果表的主键是数值类型的话可能会使用到Sequence。

1. 创建序列

创建一个序列:

CREATE SEQUENCE seq_user_id
START WITH 1
INCREMENT BY 1
NOMAXVALUE
NOCYCLE
NOCACHE;

CREATE SEQUENCE seq_user_id   创建的时候指定序列的名字

START WITH 1   从1开始

INCREMENT BY 1   每次自增1

NOMAXVALUE   不设置最大值

NOCYCLE   不循环自增,循环的话到达最大值就又回去了

NOCACHE   不缓存,如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组 到cache。 使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。

创建序列的时候需要有create sequence或者create any sequence权限。

2. 使用序列

sequenceName.currVal  获取序列的当前值

sequenceName.nextVal  获取序列的下一个值,即将当前值自增后返回

需要注意在第一次使用序列的时候(sequenceName.nextVal)才会真正去初始化它,初始化之前序列是不存在的,第一次返回的是初始值,即START WITH指定的值,如果在定义完之后想获取当前值的话就会这样:

SQL> SELECT seq_user_id.currVal FROM dual;
SELECT seq_user_id.currVal FROM dual
ORA-08002: 序列 SEQ_USER_ID.CURRVAL 尚未在此会话中定义

这个时候获取一次值(初始化)就好了:

SQL> SELECT seq_user_id.nextVal FROM dual;
NEXTVAL
----------
1 SQL> SELECT seq_user_id.currVal FROM dual;
CURRVAL
----------
1

3. 修改序列

除了START WITH之外的值都可以修改:

ALTER SEQUENCE seq_user_id
INCREMENT BY 1
NOMAXVALUE
NOCYCLE
NOCACHE;

如果想修改START WITH的值的话可以先DROP SEQUENCE,然后再CREATE SEQUENCE。

4. 删除序列

删除序列:

DROP SEQUENCE seq_user_id;

5. 实际例子

举一个表使用序列产生主键的例子。

新建一个用户表:

CREATE TABLE t_user(
id INT NOT NULL ,
username VARCHAR2(20) NOT NULL ,
passwd CHAR(32) NOT NULL ,
CONSTRAINT PK_T_USER PRIMARY KEY (id)
);

创建一个主键要使用到的序列:

CREATE SEQUENCE seq_user_id
START WITH 1
INCREMENT BY 1
NOMAXVALUE
NOCYCLE
NOCACHE;

插入几条值:

INSERT INTO t_user (id, username, passwd) VALUES (seq_user_id.nextVal, 'Sam', 'd8578edf8458ce06fbc5bb76a58c5ca4');
INSERT INTO t_user (id, username, passwd) VALUES (seq_user_id.nextVal, 'Tom', 'd8578edf8458ce06fbc5bb76a58c5ca4');
INSERT INTO t_user (id, username, passwd) VALUES (seq_user_id.nextVal, 'John', 'd8578edf8458ce06fbc5bb76a58c5ca4');
INSERT INTO t_user (id, username, passwd) VALUES (seq_user_id.nextVal, 'Alice', 'd8578edf8458ce06fbc5bb76a58c5ca4');

查看表中的数据:

SQL> SELECT * FROM t_user;
ID USERNAME PASSWD
--------------------------------------- -------------------- --------------------------------
1 Sam d8578edf8458ce06fbc5bb76a58c5ca4
2 Tom d8578edf8458ce06fbc5bb76a58c5ca4
3 John d8578edf8458ce06fbc5bb76a58c5ca4
4 Alice d8578edf8458ce06fbc5bb76a58c5ca4

.