oracle实验25:Sequence序列

Sequence序列

  • 序列是一种数据库对象。
  • 用于产生唯一数字列值。
  • 一般使用序列自动地生成主键或唯一键值。
  • 序列可以是升序或降序。
  • 每个序列可以建立多个序列。

语法

CREATE SEQUENCE [schema.]序列名
[INCREMENT BY n]
[START WITH n]
[MAXVALUE n| NOMAXVALUE]
[MINVALUE n| NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE n| NOCACHE];

序列语法说明

  • 创建序列,必须有CREATE SEQUENCE或CREATE ANY SEQUENCE权限。
  • 序列被创建后,可以通过查询数据字典视图USER_SEQUENCES查看序列信息。
  • 当全部缺省时,则该序列为上升序列,由1开始,增量为1,没有上限,缓存中序列值个数为20。
  • INCREMENT BY n:n可为正的或负的整数,但不可为0。默认值为1。
  • START WITH n:指定生成的第一个序列号,默认为1。对于升序,默认为序列的最小值。对于降序,默认为序列的最大值。
  • MAXVALUE n:指定n为序列可生成的最大值。
  • NOMAXVALUE:为默认情况。指定升序最大值为1027,指定降序指定最大值为-1。
  • MINVALUE n:指定n为序列的最小值。
  • NOMINVALUE:为默认情况。指定升序默认最小值为1。指定降序默认最小值为-1026。
  • CYCLE:指定序列使用循环。即序列达到了最大值,则返回最小值重新开始。默认为NOCYCLE。
  • CACHE n:定义n个序列值保存在缓存中,默认值为20个。

实验25:序列的概念和使用

建立序列

SQL> create sequence s1
  2   increment by 2
  3   start with 1
  4   maxvalue 10
  5   minvalue -10
  6   nocycle
  7   nocache;

序列已创建。

查看序列

SQL> select * from user_sequences;

SEQUENCE_NAME   MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
-------------- ---------- ---------- ------------ - - ---------- ------------                                                                   
S1                    -10         10            2 N N          0           1

引用序列的值

SQL> select s1.nextval from dual;--取序列s1的下一个值

   NEXTVAL                                                                     
----------                                                                     
         1                                                                     

SQL> select s1.currval from dual;--取序列s1的当前值

   CURRVAL                                                                     
----------                                                                     
         1                                                                     

 

建立一个和dept表结构相同,但不含任何行的空表。

SQL>  drop table d purge;

表已删除。

SQL> create table d as select * from dept where 0=9;

表已创建。

SQL> select * from d;

未选定行

SQL> insert into d(deptno) values(s1.nextval);

已创建 1 行。

SQL> insert into d(deptno) values(s1.nextval);

已创建 1 行。

SQL> select * from d;

    DEPTNO DNAME          LOC                                                  
---------- -------------- -------------                                        
         3                                                                     
         5                                                                     

修改序列

语法

ALTER SEQUENCE [schema.]序列名
[INCREMENT BY n]
[MAXVALUE n| NOMAXVALUE]
[MINVALUE n| NOMINVALUE]
[CYCLE | NOCYCLE]
[CACHE n| NOCACHE];

  • 必须是序列的所有者,或者有ALTER ANY SEQUENCE 权限才能修改序列。
  • 修改序列的语法除没有START WITH子句外。

序列的当前值一定要在最大和最小之间。
步长不能为0。

SQL> alter sequence s1 increment by -2;

序列已更改。
 
SQL> alter sequence s1 cycle;

序列已更改。

 

序列值得不连续问题

事务回退,序列号不回退。

SQL> insert into d(deptno) values(s1.nextval);

已创建 1 行。
                                                                    
SQL>  select * from d;

    DEPTNO DNAME          LOC                                                  
---------- -------------- -------------                                        
         3                                                                     
         5                                                                     
         3                                                                     

SQL> rollback;

回退已完成。

SQL>  insert into d(deptno) values(s1.nextval);

已创建 1 行。

SQL>  select * from d;

    DEPTNO DNAME          LOC                                                  
---------- -------------- -------------                                        
         3                                                                     
         5                                                                     
         1                                                                     

SQL> insert into d(deptno) values(s1.nextval);

已创建 1 行。

SQL> select * from d;

    DEPTNO DNAME          LOC                                                  
---------- -------------- -------------                                        
         3                                                                     
         5                                                                     
         1                                                                     
        -1                                                                     

SQL> insert into dept(deptno) values(s1.nextval); --其他语句引用了该序列

已创建 1 行。

SQL> select * from dept;

    DEPTNO DNAME          LOC                                                  
---------- -------------- -------------                                        
        -3                                                                     
        10 ACCOUNTING     NEW YORK                                             
        20 RESEARCH       DALLAS                                               
        30 SALES          CHICAGO                                              
        40 OPERATIONS     BOSTON                                               

cache 序列的值到内存中

nocache 每次取值都要计算

cache n 一次就放入内存n个值。默认时20。

SQL>  alter sequence s1 cache 30;
 alter sequence s1 cache 30
*
第 1 行出现错误:
ORA-04013: CACHE 值必须小于 CYCLE 值


SQL>  alter sequence s1 cache 5;

序列已更改。

SQL>  insert into d(deptno) values(s1.nextval);

已创建 1 行。

SQL> select * from user_sequences;

SEQUENCE_NAME                   MIN_VALUE  MAX_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER
------------------------------ ---------- ---------- ------------ - - ---------- ----------- 
S1                                    -10         10           -2 Y N          5         -11

删除序列

语法

DROP SEQUENCE [schema.]序列名;

  • 对序列的删除必须是序列的所有者或者具有DROP ANY SEQUENCE权限的用户才可以完成。

SQL> drop sequence s1;

序列已删除。

使用序列的原则

  • 如果想使用序列做主键,请使用不可循环的序列。
  • 如果想快速产生序列的值,将cache的值加大。
  • 如果序列序列内的值要很长时间才能使用完,可以考虑使用可以循环的序列。

知识点

  • 序列是共享的对象
  • 主要用来产生主键
posted on 2013-06-26 21:10  不吃鱼的小胖猫  阅读(588)  评论(0编辑  收藏  举报