• 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的值加大。
    • 如果序列序列内的值要很长时间才能使用完,可以考虑使用可以循环的序列。

    知识点

    • 序列是共享的对象
    • 主要用来产生主键
  • 相关阅读:
    cacti汇总流量图-将数据合并后作图
    Linux下查看磁盘与目录的容量——df、du
    Nagios
    Linux下的压缩和解压缩命令——jar
    Linux下的压缩和解压缩命令——tar
    Linux下的压缩和解压缩命令——compress/uncompress
    Linux下的压缩和解压缩命令——gzip/gunzip
    Linux下的压缩和解压缩命令——bzip2/bunzip2
    Linux下的压缩和解压缩命令——zip/unzip
    Nagios安装
  • 原文地址:https://www.cnblogs.com/downpour/p/3149188.html
Copyright © 2020-2023  润新知