Oracle基础1 — sequence 序列

一. 关于序列

序列是一个Oracle对象,提供唯一的数字,在需要时根据指定的增量值来递增,通常是用于产生主键值。类似于SQL server中的identity(int,1,1) 或者列为identity列。SQL server可以直接将列指定为IDENTITY列,在使用的时候可以不需要理会IDENTITY列,系统会自动递增,这样看来SQL Server中主键的产生更为方便。

1.序列的特性

自动提供唯一的数值

共享对象

主要用于提供主键值

代替应用代码

将序列值装入内存可以提高访问效率


2.如何create sequence语句定义序列

前提:Prerequisites

To create a sequence inyour own schema, you must have the CREATE SEQUENCE system privilege. 在自己模式下创建序列需要create sequence权限

To create a sequence inanother user's schema, you must have the CREATE ANY SEQUENCE system privilege. 在其他用户模式下创建序列需要create any sequence权限。

 CREATE SEQUENCE sequencename

       [INCREMENT BY n]             定义序列增长步长,省略为1

       [START WITH m]               序列起始值,省略为1

       [{MAXVALUE n | NOMAXVALUE}] 序列最大值,NOMAXVALUE升序时,序列最大值的次方

                                    降序时为-(默认也是为此)

       [{MINVALUE n | NOMINVALUE}] 序列最小值,NOMINVALUE升序时,最小值为,降序时序列

                                    最小值为-的次方(默认也是为此)

       [{CYCLE | NOCYCLE}]         到达最大值或最小值后,继续产生序列(默认NOCYCLE)

       [{CACHE n | NOCACHE}];       序列缓存与否(默认NOCACHE)

       --创建一个序列

           SQL> CREATE SEQUENCE my_seq

             2  INCREMENT BY 10

             3  START WITH 100

             4  MAXVALUE 150

             5  NOCACHE

             6  NOCYCLE;

 

           Sequence created.

 

    3.使用序列

       NEXTVAL 和CURRVAL 伪列

           NEXTVAL 返回序列中下一个有效的值,任何用户都可以引用

           CURRVAL 中存放序列的当前值

           第一次使用时CURRVAL不能用

           使用时需要指定序列的对象名

           将序列值装入内存可提高访问效率

       序列在下列情况下出现裂缝:

           –回滚

           –系统异常

           –多个表同时使用同一序列

       如果不将序列的值装入内存(NOCACHE), 可使用表USER_SEQUENCES 查看序列当前的有效值

 --当第一次使用序列时指定了currval列,结果出现如下错误提示    

           SQL> SELECT my_seq.currval FROM dual;

           SELECT my_seq.currval FROM dual

                 *

           ERROR at line 1:

           ORA-08002: sequence MY_SEQ.CURRVAL is not yet defined in this session

 

       --使用nextval列,则成功执行,这就是NEXTVAL 必须在CURRVAL 之前指定,及第一次使用必须是NEXTVAL

           SQL> SELECT my_seq.nextval FROM dual;

 

              NEXTVAL

           ----------

                 100

 

           SQL> SELECT my_seq.currval FROM dual;

 

              CURRVAL

           ----------

                 100 

SQL>  create sequence student_test_seq start with 1 NOCACHE;

Sequence created.

SQL> select student_test_seq.currval from dual;
select student_test_seq.currval from dual
       *
ERROR at line 1:
ORA-08002: sequence STUDENT_TEST_SEQ.CURRVAL is not yet defined in this session


SQL>  select student_test_seq.nextval from dual;

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

SQL> select student_test_seq.currval from dual;

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

    4.查询序列

       USER_SEQUENCES

       DBA_SEQUENCES

       ALL_SEQUENCES

       查询数据字典视图USER_SEQUENCES获取序列定义信息

       如果指定NOCACHE 选项,则列LAST_NUMBER 显示序列中下一个有效的值

 

       SQL> SELECT sequence_name,min_value,max_value

         2      increment_by,cycle_flag,order_flag,

         3      cache_size,last_number

         4  FROM user_sequences

         5  WHERE sequence_name IN ('SEQ1','SEQ2','MY_SEQ');

 

       SEQUENCE_NAME                   MIN_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER

       ------------------------------ ---------- ------------ - - ---------- -----------

       MY_SEQ                                  1          150 N N          0         110

       SEQ1                                    1          200 Y N          0         110

       SEQ2                                    1          200 Y N          0          31


 SQL> SELECT sequence_name,min_value,max_value

         2      increment_by,cycle_flag,order_flag,

         3      cache_size,last_number

         4  FROM user_sequences

         5  WHERE sequence_name IN ('SEQ1','SEQ2','MY_SEQ');

 

       SEQUENCE_NAME                   MIN_VALUE INCREMENT_BY C O CACHE_SIZE LAST_NUMBER

       ------------------------------ ---------- ------------ - - ---------- -----------

       MY_SEQ                                  1          150 N N          0         110

       SEQ1                                    1          200 Y N          0         110

       SEQ2                                    1          200 Y N          0          31

6.修改序列

       修改序列的增量, 最大值, 最小值, 循环选项, 或是否装入内存

      

       修改序列的注意事项

           必须是序列的拥有者或对序列有ALTER 权限

           只有将来的序列值会被改变

           改变序列的初始值只能通过删除序列之后重建序列的方法实现

           其它的一些限制

 

       SQL> ALTER SEQUENCE my_seq

         2  INCREMENT BY 20

         3  MAXVALUE 160

         4  CYCLE;

 

       Sequence altered

 

       --注意当序列值达到最大值后,其初始值变成了,但增量值不会发生变,如下面的例子

           SQL> select sys.my_seq.nextval from dual;

 

              NEXTVAL

           ----------

                 130

 

           SQL> /

 

              NEXTVAL

           ----------

                 150

 

           SQL> /    --此时序列值变成了

 

              NEXTVAL

           ----------

                   1

 

           SQL> /   --此时序列值按作为增量值,所以结果为

 

              NEXTVAL

           ----------

                  21    

 

    7.删除序列

       使用DROP SEQUENCE 语句删除序列

       删除之后,序列不能再次被引用


SQL> alter sequence STUDENT_TEST_SEQ increment by 5 maxvalue 20 cycle;

Sequence altered.

SQL> select student_test_seq.nextval from dual;

   NEXTVAL
----------
         6

SQL> select student_test_seq.nextval from dual;

   NEXTVAL
----------
        11

SQL> select student_test_seq.nextval from dual;

   NEXTVAL
----------
        16

SQL> select student_test_seq.nextval from dual;

   NEXTVAL
----------
         1
SQL>  drop sequence student_test_seq;


Sequence dropped.


你可能感兴趣的:(oracle,数据库,oracle基础)