zoukankan      html  css  js  c++  java
  • Oracle笔记之序列(Sequence)

    Oracle中序列是一种数据对象,可以视为一个等差数列,我们自增就是一个遍历这个数列的过程,可以取当前值,也可以将当前值自加n后返回,Sequence与表没有太大的关系,有的时候如果表的主键是数值类型的话可能会使用到Sequence。

    1. 创建序列

    创建一个序列:

    CREATE SEQUENCE seq_user_id 
    START WITH 1  
    INCREMENT BY 1  
    NOMAXVALUE 
    NOCYCLE  
    NOCACHE; 

    CREATE SEQUENCE seq_user_id   创建的时候指定序列的名字

    START WITH 1   从1开始

    INCREMENT BY 1   每次自增1

    NOMAXVALUE   不设置最大值

    NOCYCLE   不循环自增,循环的话到达最大值就又回去了

    NOCACHE   不缓存,如果指定CACHE值,ORACLE就可以预先在内存里面放置一些sequence,这样存取的快些。cache里面的取完后,oracle自动再取一组 到cache。 使用cache或许会跳号, 比如数据库突然不正常down掉(shutdown abort),cache中的sequence就会丢失. 所以可以在create sequence的时候用nocache防止这种情况。

    创建序列的时候需要有create sequence或者create any sequence权限。

    2. 使用序列

    sequenceName.currVal  获取序列的当前值

    sequenceName.nextVal  获取序列的下一个值,即将当前值自增后返回

    需要注意在第一次使用序列的时候(sequenceName.nextVal)才会真正去初始化它,初始化之前序列是不存在的,第一次返回的是初始值,即START WITH指定的值,如果在定义完之后想获取当前值的话就会这样:

    SQL> SELECT seq_user_id.currVal FROM dual;
    SELECT seq_user_id.currVal FROM dual
    ORA-08002: 序列 SEQ_USER_ID.CURRVAL 尚未在此会话中定义

    这个时候获取一次值(初始化)就好了:

    SQL> SELECT seq_user_id.nextVal FROM dual;
       NEXTVAL
    ----------
             1
    
    SQL> SELECT seq_user_id.currVal FROM dual;
       CURRVAL
    ----------
             1

    3. 修改序列

    除了START WITH之外的值都可以修改:

    ALTER SEQUENCE seq_user_id 
    INCREMENT BY 1   
    NOMAXVALUE 
    NOCYCLE  
    NOCACHE; 

    如果想修改START WITH的值的话可以先DROP SEQUENCE,然后再CREATE SEQUENCE。

    4. 删除序列

    删除序列:

    DROP SEQUENCE seq_user_id;

    5. 实际例子

    举一个表使用序列产生主键的例子。

    新建一个用户表:

    CREATE TABLE t_user(
    	id INT NOT NULL ,
    	username VARCHAR2(20) NOT NULL ,
    	passwd CHAR(32) NOT NULL ,
    	CONSTRAINT PK_T_USER PRIMARY KEY (id)
    );

    创建一个主键要使用到的序列:

    CREATE SEQUENCE seq_user_id 
    START WITH 1 
    INCREMENT BY 1 
    NOMAXVALUE 
    NOCYCLE 
    NOCACHE;

    插入几条值:

    INSERT INTO t_user (id, username, passwd) VALUES (seq_user_id.nextVal, 'Sam', 'd8578edf8458ce06fbc5bb76a58c5ca4');
    INSERT INTO t_user (id, username, passwd) VALUES (seq_user_id.nextVal, 'Tom', 'd8578edf8458ce06fbc5bb76a58c5ca4');
    INSERT INTO t_user (id, username, passwd) VALUES (seq_user_id.nextVal, 'John', 'd8578edf8458ce06fbc5bb76a58c5ca4');
    INSERT INTO t_user (id, username, passwd) VALUES (seq_user_id.nextVal, 'Alice', 'd8578edf8458ce06fbc5bb76a58c5ca4');
    

    查看表中的数据:

    SQL> SELECT * FROM t_user;
                                         ID USERNAME             PASSWD
    --------------------------------------- -------------------- --------------------------------
                                          1 Sam                  d8578edf8458ce06fbc5bb76a58c5ca4
                                          2 Tom                  d8578edf8458ce06fbc5bb76a58c5ca4
                                          3 John                 d8578edf8458ce06fbc5bb76a58c5ca4
                                          4 Alice                d8578edf8458ce06fbc5bb76a58c5ca4

     

    .

  • 相关阅读:
    Python之pytest 基础
    unittest和pytest的区别
    Selenium 常用定位对象元素的方法
    ORCAl存储过程
    Mysql的存储过程
    TestNG 搭建测试框架 自动化测试
    通过junit/TestNG+java 实现自动化测试
    查看APP用到的图片方法
    码农干私活的建议(转)
    Android的onCreateOptionsMenu()创建菜单Menu详解(转)
  • 原文地址:https://www.cnblogs.com/cc11001100/p/6988157.html
Copyright © 2011-2022 走看看