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
.