• oracle数据库--序列(sequence)


    一个问题:

    在某张表中,存在一个id列(整数),我们希望在添加记录的时候,该列从1开始,自动的增长,怎么处理?

    解决方式:oracle是利用“序列”(sequence)来完成的。

    序列(sequence)介绍

    oracle中,是通过使用序列(sequence)来处理自动增长列。

    (1)可以为表中的列自动产生值。

    (2)由用户创建数据库对象,并可由多个用户共享。

    (3)一般用于主键或唯一列。

    创建序列基本语法:

    create sequence 序列名称

    start with 开始数字

    increment by 增长数字

    minvalue 最小值

    maxvalue 最大值

    cycle

    nocache

    详细说明:

    start with 开始数字à从几开始

    increment by 增长à步长,每次增长几个数

    minvalue 最小值

    maxvalue 最大值à可以不设置,不设置应写为nomaxvalue,也就是无穷大

    cycle  循环,也就是说当长增长到最大值后,再从最小值开始重新增长

    nocache 不设缓存

    案例说明:

    create sequence my_seq --创建序列名

    start with 1            --从1开始

    increment by 1          --每次增长1

    maxvalue 999999999      --最大值 //nomaxvalue(不设置最大值)

    minvalue 1              --最小值

    cycle                   --循环 //nocycle(一直累加,不循环)

    nocache                 --不使用缓存

    解释:从1开始,每次增长1,最大值999999999,之后循环从1开始。

    create sequence myseq

    start with 0

    increment by 1

    minvalue 0

    nomaxvalue

    nocycle

    nocache;

    解释:从0开始,每次增长1,最小值0,无穷大,不循环一直累加。

    sequence的使用:

    create table test1(id number primary key,name varchar2(32));

    insert into test1 values(myseq.nextval,'abc');

    insert into test1 values(myseq.nextval,'ddd');

    特别说明:

    1、myseq:表示序列的名字,nextval:关键字,表示从序列中取下一个值。

    2、sequence序列是需要配合number类型的列来使用;

    3、sequence序列是要在主键或unique列上使用的。

    问题:

    如果system用户使用scott的sequence的序列时,sequence是从1增长还是从已使用到的数字开始?

    答案:是从已使用到的数字接着增长。

    细节说明:

    看例子:

    insert into emp values(my_seq.nextval,'tomcat','clerk',7566,sysdate,1200,null,20);

    select my_seq.currval from dual;

    注意:

    第一次使用nextval返回的是初始值;

    随后的nextval会自动增加你定义的increment by值,然后返回增加后的值;

    currval总是返回当前sequence的值,但是在第一次nextval初始化之后才能使用currval,否则会出错。

    使用一次nextval会增加一次sequence的值,所以如果你在同一个语句里面使用多个nextval,其值就是不一样的。

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

    一旦定义了某个序列,你就可以用currval,nextval

    currval:返回sequence的当前值

    nextval:增加sequence的值,然后返回sequence值。

    比如:

    序列名.crrval

    序列名.nextval

    什么时候使用sequence?

    不包含子查询、snapshot/view的select的语句

    insert语句的子查询中

    insert语句的values中

    update的set中

    如:update 表名 列值=序列名.nextval where 条件;

    在sqlserver和mysql中都可以在定义表的时候,直接给指定自增长。

    sqlserver中设置自增长

    create table 表名(id int primary key identity(1,1),name varchar(32));

    mysql中设置自增长

    create table 表名(id int primary key auto_incrment,name varchar(32));

  • 相关阅读:
    POJ1422 Air Raid 【DAG最小路径覆盖】
    Android studio ElasticDownloadView
    POJ 1753 Flip Game
    Ogre嵌入MFC傻瓜全然教程(三)
    你的水桶有多满
    uva 10581
    map 解析
    In-Out Parameters inout keyword
    Associated Values & enum
    函数式编程 归档
  • 原文地址:https://www.cnblogs.com/roger112/p/7724413.html
Copyright © 2020-2023  润新知