SQL基礎--序列


   序列是一種數據庫對象,用來自動產生一組唯一的序號;序列是一種共享式的對象,多個用戶可以共同使用序列中的序號。

 

序列的創建語法

   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.

 


免責聲明!

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



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