序列是一種數據庫對象,用來自動產生一組唯一的序號;序列是一種共享式的對象,多個用戶可以共同使用序列中的序號。
序列的創建語法
CREATE SEQUENCE sequencename
[INCREMENT BY n] 定義序列增長步長,省略為1
[START WITH m] 序列起始值,省略為1
[{MAXVALUE n | NOMAXVALUE}] 序列最大值,
[{MINVALUE n | NOMINVALUE}] 序列最小值
[{CYCLE | NOCYCLE}] 到達最大值或最小值后,繼續產生序列(默認NOCYCLE)
[{CACHE n | NOCACHE}]; CACHE默認是20
--創建一個簡單序列
SQL> create sequence myseq;
使用序列
NEXTVAL 和CURRVAL 偽列
NEXTVAL 返回序列中下一個有效的值,任何用戶都可以引用
CURRVAL 中存放序列的當前值
第一次使用時CURRVAL不能用
使用時需要指定序列的對象名
將序列值裝入內存可提高訪問效率
序列在下列情況下出現裂縫:
–回滾
–系統異常
–多個表同時使用同一序列
如果不將序列的值裝入內存(NOCACHE), 可使用表USER_SEQUENCES 查看序列當前的有效值
SQL> select myseq.currval from dual; select myseq.currval from dual * 第 1 行出現錯誤: ORA-08002: 序列 MYSEQ.CURRVAL 尚未在此會話中定義 SQL> select myseq.nextval from dual; NEXTVAL ---------- 1 SQL> select myseq.currval from dual; CURRVAL ---------- 1
--實際應用
SQL> create table member( 2 mid number, 3 name varchar2(50) not null, 4 constraint pk_mid primary key(mid) 5 ); 表已創建。 SQL> insert into member(mid,name) values (myseq.nextval,'Scott'); 已創建 1 行。 SQL> insert into member(mid,name) values (myseq.nextval,'Tom'); 已創建 1 行。 SQL> select * from member; MID NAME ---------- -------------------------------------------------- 4 Scott 5 Tom
查詢和刪除序列
SQL> select * from user_sequences; SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER ------------------------------ ---------- ---------- ------------ - - ---------- ----------- MYSEQ 1 1.0000E+28 1 N N 20 21 SQL> drop sequence myseq; 序列已刪除。
創建特殊功能的序列
--設置序列的初始值和增長步長
SQL> create sequence myseq 2 increment by 5 3 start with 30; 序列已創建。 SQL> select myseq.currval from dual; select myseq.currval from dual * 第 1 行出現錯誤: ORA-08002: 序列 MYSEQ.CURRVAL 尚未在此會話中定義 SQL> select myseq.nextval from dual; NEXTVAL ---------- 30
--cache和nocache
默認情況是打開緩存的,默認的大小是20,這里有一個重要的參數是LAST_NUMBER
SQL> create sequence myseq cache 100; 序列已創建。 SQL> select * from user_sequences; SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER ------------------------------ ---------- ---------- ------------ - - ---------- ----------- MYSEQ 1 1.0000E+28 1 N N 100 1 SQL> select myseq.nextval from dual; NEXTVAL ---------- 1 SQL> select * from user_sequences; SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER ------------------------------ ---------- ---------- ------------ - - ---------- ----------- MYSEQ 1 1.0000E+28 1 N N 100 101
使用nocache
SQL> create sequence myseq nocache; 序列已創建。 SQL> select * from user_sequences; SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER ------------------------------ ---------- ---------- ------------ - - ---------- ----------- MYSEQ 1 1.0000E+28 1 N N 0 1 SQL> select * from user_sequences; SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER ------------------------------ ---------- ---------- ------------ - - ---------- ----------- MYSEQ 1 1.0000E+28 1 N N 0 1 SQL> select myseq.nextval from dual; NEXTVAL ---------- 1 SQL> select * from user_sequences; SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER ------------------------------ ---------- ---------- ------------ - - ---------- ----------- MYSEQ 1 1.0000E+28 1 N N 0 2
--使用循環序列
循環序列是指每次調用nextval可以產生指定范圍的數據,比如在1、3、5、7、9這5個數字中產生
SQL> create sequence myseq 2 start with 1 3 increment by 2 4 maxvalue 10 5 minvalue 1 6 cycle 7 cache 3; 序列已創建。 SQL> select myseq.nextval from dual; NEXTVAL ---------- 1 SQL> select * from user_sequences; SEQUENCE_NAME MIN_VALUE MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER ------------------------------ ---------- ---------- ------------ - - ---------- ----------- MYSEQ 1 10 2 Y N 3 7
修改序列
修改序列的注意事項
必須是序列的擁有者或對序列有ALTER 權限
只有將來的序列值會被改變
改變序列的初始值只能通過刪除序列之后重建序列的方法實現
其它的一些限制
SQL> ALTER SEQUENCE myseq 2 INCREMENT BY 20 3 MAXVALUE 160 4 CYCLE;
Oracle12C新特性
從oracle12c開始提供了像mysql那樣的自動增長列
SQL> create table tab_test2( 2 id number generated as identity ( 3 start with 50 increment by 2), 4 name varchar2(30)); Table created.