Oracle筆記之序列(Sequence)


 

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

 

 

.


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM