精华内容
下载资源
问答
  • Oracle序列

    千次阅读 2015-11-26 11:38:21
    Oracle序列
    
    

    Oracle序列

    序列(sequence)介绍

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

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

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

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

    PS:SQL Server,MySQL中都是用非常简单的一条语句来实现自增长的,没有像在Oracle中这样定义成一个对象--序列(sequence)来进行使用。定义成对象的好处就是方便管理,效率更高。

     

    创建序列基本语法:

    create sequence 序列名称

    start with 开始数字

    increment by 增长数字

    minvalue 最小值

    maxvalue 最大值 | nomaxvalue 无穷大

    cycle | nocycle

    cache | nocache

     

    详细说明:

    start with 始数字à从几开始

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

    minvalue 最小值

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

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

    nocache 不设缓存cache设置缓存,设置缓存的优点是提高效率,但是缺点就是当出现意外中断时,缓存中没有使用的序列数字将被舍弃


    实例:

    --创建一个序列
    create sequence myseq1
    start with 1    --初始值
    increment by 1  --自增值
    minvalue 1   --最小值
    maxvalue 30000  --最大值
    cycle    --循环
    nocache --不缓存
    
    --创建表
    create table test1
    (
           id number primary key,
           name varchar2(30)
    );
    --使用序列
    insert into test1 values(myseq1.nextval,'a');
    insert into test1 values(myseq1.nextval,'a');
    insert into test1 values(myseq1.nextval,'a');
    select * from test1;
    
    --查看序列到多少号了
    select myseq1.currval from dual;

    特别说明:

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

    2、sequence序列是需要number类型的列使用

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

    4、第一次使用nextval返回的是初始值;随后的nextval会自动增加你定义的increment by值,然后返回增加后的值;

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

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

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


    使用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_increment,name varchar(32));

     

    ----------参考《韩顺平玩转Oracle》


    展开全文
  • oracle 序列

    2013-09-15 12:14:16
  • Oracle序列创建和使用

    万次阅读 多人点赞 2018-01-12 00:10:58
    Oracle序列创建和使用 创建序列 语法 CREATE SEQUENCE 序列名 [相关参数] 参数说明 INCREMENT BY :序列变化的步进,负值表示递减。(默认1) START WITH:序列的初始值 。(默认1) MAXvalue:序列可生成的最大值。...

    Oracle序列创建和使用

    • 创建序列
    • 语法 CREATE SEQUENCE 序列名 [相关参数]
    • 参数说明
      INCREMENT BY :序列变化的步进,负值表示递减。(默认1)
      START WITH:序列的初始值 。(默认1)
      MAXvalue:序列可生成的最大值。(默认不限制最大值,NOMAXVALUE)
      MINVALUE:序列可生成的最小值。(默认不限制最小值,NOMINVALUE)
      CYCLE:用于定义当序列产生的值达到限制值后是否循环(NOCYCLE:不循环,CYCLE:循环)。
      CACHE:表示缓存序列的个数,数据库异常终止可能会导致序列中断不连续的情况,默认值为20,如果不使用缓存可设置NOCACHE

    • CREATE SEQUENCE SEQ_DEMO INCREMENT BY 1 START WITH 1 NOMAXvalue NOCYCLE NOCACHE;

    • 修改、删除序列
    • 使用 alter 命令进行修改
    • 使用 drop 命令删除

    • 序列的使用
    • currval 表示序列的当前值,新序列必须使用一次nextval 才能获取到值,否则会报错
    • nextval 表示序列的下一个值。新序列首次使用时获取的是该序列的初始值,从第二次使用时开始按照设置的步进递增
    • 查询序列的值:select seq_name.[currval,nextval] from dual;
    • 查看所有已创建的序列:select * from user_sequences
    • SQL语句中使用:insert into table (id) values (seq_name.nextval)
    展开全文
  • ORACLE 序列

    2016-01-05 13:53:42
    Oracle序列的语法格式为: CREATE SEQUENCE 序列名 [INCREMENT BY n] [START WITH n] [{MAXVALUE/ MINVALUE n|NOMAXVALUE}] [{CYCLE|NOCYCLE}] [{CACHE n|NOCACHE}]; a.INCREMENT BY用于定义序列的步长...

    1)创建序列

    Oracle序列的语法格式为:
    CREATE SEQUENCE
     序列名
    [INCREMENT BY n]
    [START WITH n]
    [{MAXVALUE/ MINVALUE n|NOMAXVALUE}]
    [{CYCLE|NOCYCLE}]
    [{CACHE n|NOCACHE}];


    a.INCREMENT BY用于定义序列的步长,如果省略,则默认为1,如果出现负值,则代表Oracle序列的值是按照此步长递减的。
    b.START WITH 定义序列的初始值(即产生的第一个值),默认为1
    c.MAXVALUE 定义序列生成器能产生的最大值。选项NOMAXVALUE是默认选项,代表没有最大值定义,这时对于递增Oracle序列,系统能够产生的最大值是1027次方
    d.MINVALUE定义序列生成器能产生的最小值。选项NOMINVALUE是默认选项,代表没有最小值定义,这时对于递减序列,系统能够产生的最小值是-1026次方

    e.CYCLENOCYCLE 表示当序列生成器的值达到限制值后是否循环。CYCLE代表循环,NOCYCLE代表不循环。如果循环,则当递增序列达到最大值时,循环到最小值;对于递减序列达到最小值时,循环到最大值。如果不循环,达到限制值后,继续产生新值就会发生错误。

    f.CACHE(缓冲)定义存放序列的内存块的大小,默认为20NOCACHE表示不对序列进行内存缓冲。对序列进行内存缓冲,可以改善序列的性能。当序列走到LAST_NUMBER时,即缓存的值已用完,自动生成下一个LAST_NUMBER,LAST_NUMBER=当前值+CACHE SIZE

    2)删除序列

    语法:DROP SEQUENCE 序列名;

    3)修改序列

    ALTER SEQUENCE 序列名
      [INCREMENT BY n]
      [{MAXVALUE/ MINVALUE n|NOMAXVALUE}]
      [{CYCLE|NOCYCLE}]
      [{CACHE n|NOCACHE}];

    不能修改序列的初始值

    4)使用

    1.直接调用

    调用NEXTVAL将生成序列中的下一个序列号,调用时要指出序列名,即用以下方式调用: 序列名.NEXTVAL

    CURRVAL用于产生序列的当前值,无论调用多少次都不会产生序列的下一个值。如果序列还没有通过调用NEXTVAL产生过序列的下一个值,先引用CURRVAL没有意义。调用CURRVAL的方法同上,要指出序列名,即用以下方式调用:序列名.CURRVAL

    2.建立触发器使用


    假设有表TEST,其主键为TEST_ID
    (1)建立递增序列SEQ_WUHEN:
    create sequence SEQ_WUHEN
    increment by 1
    start with 1
    minvalue 1 nomaxvalue
    nocycle;

    (2)建立触发器,当有数据插入表TEST时,使用Oracle序列为其去的递增的主键值
    create trigger TRG_WUHEN before insert on WUHEN
    for each row
    begin
    select SEQ_WUHEN.nextval into :new.WUHEN_ID from dual;
    end;

    5)查询
    SQL> desc dba_sequences;
    Name           Type         Nullable Default Comments                                    
    -------------- ------------ -------- ------- --------------------------------------------
    SEQUENCE_OWNER VARCHAR2(30)                  Name of the owner of the sequence           
    SEQUENCE_NAME  VARCHAR2(30)                  SEQUENCE name                               
    MIN_VALUE      NUMBER       Y                Minimum value of the sequence               
    MAX_VALUE      NUMBER       Y                Maximum value of the sequence               
    INCREMENT_BY   NUMBER                        Value by which sequence is incremented      
    CYCLE_FLAG     VARCHAR2(1)  Y                Does sequence wrap around on reaching limit?
    ORDER_FLAG     VARCHAR2(1)  Y                Are sequence numbers generated in order?    
    CACHE_SIZE     NUMBER                        Number of sequence numbers to cache         
    LAST_NUMBER    NUMBER                        Last sequence number written to disk      

    5)序列复位
    create or replace procedure pkg_seq_reset(v_seqname varchar2 ) as
    n number( 10);
    tsql varchar2( 100);
    begin
    execute immediate 'alter sequence '||v_seqname|| ' minvalue 0'; --若序列最小值等于初始值,需修改序列使最小值小于初始值
    execute immediate 'select '||v_seqname|| '.nextval from dual' into n;
      n:=-(n);
      tsql:='alter sequence '||v_seqname|| ' increment by '|| n; --使序列负增长
    execute immediate tsql;
    execute immediate 'select '||v_seqname|| '.nextval from dual' into n; --序列回到最初值。注意n不能省略,省略后这步的执行将在下一步被回退,判断为动态sql造成的,原因未知。
    execute immediate 'alter sequence '||v_seqname|| ' increment by 1';
    end pkg_seq_reset;

    展开全文
  • Oracle 序列

    2015-12-17 20:22:18
    在开始讲解Oracle序列使用方法之前,先加一点关于Oracle client sqlplus的使用,就是如果执行多行语句的话一定要加“/”才能表示结束,并执行!本篇文章的主题是通过创建Oracle序列和触发器实现表的主键自增。 1....
  • oracle序列和mysql序列

    2017-05-18 16:59:03
    oracle序列和mysql序列区别
  • oracle 序列迁移

    2020-04-02 10:57:35
    1.oracle 序列迁移 背景:需要对oracle数据库的数据进行迁移,数据表都迁移过去了,但序列未跟随表,这个在oracle中是单独存在的,不像mysql,序列是和表关联在一起的。言归正传,oracle中的序列 SELECT 'drop ...
  • oracle 序列重置

    千次阅读 2015-06-24 16:24:49
    问题一:如何重置oracle序列 oracle序列创建以后,如果想重置序列从 0 开始,逐渐递增1,可以采用如下存储过程:create or replace procedure reset_seq( p_seq_name in varchar2 ) is l_val number; begin ...
  • Oracle 序列 每天 重建

    2015-06-29 16:51:10
    Oracle 序列 每天 重建
  • Oracle序列小结

    2017-01-04 20:19:12
    通过创建oracle序列和触发器来实现表的主键自增 特点: 1、自动提供唯一的数值; 2、共享对象; 3、主要用于提供主键值和计数; 4、将序列值装入内存可以提高访问效率; 创建序列: 1、要
  • oracle 序列操作

    2012-09-19 17:14:59
    1、oracle 序列的创建  CREATE SEQUENCE 名字 MINVALUE 1 MAXVALUE 999999999999999999999999999 INCREMENT BY 1 START WITH 1 CACHE 20 NOORDER...2、查询oracle序列的下一个值 select 序列名.nextval from dual;
  • Oracle序列和主键映射

    千次阅读 2016-08-10 13:59:32
    每张表都有主键,可分别简单主键和组合主键,简单主键为表中的一列,组合主键为表中的几列。主键的生成策略有许多种,其中,序列是oracle常见的主键生成策略之...其中,主键生成策略是oracle序列,JPA实现是Hibernate。
  • EFCore使用Oracle序列

    2020-05-08 10:49:07
    EFCore使用Oracle序列 找到DBContext上下文 在OnModelCreating方法中增加以下代码 modelBuilder.Entity<实体类名称>(entity => { entity.ToTable("实体类名称"); entity.Property(o =>...
  • oracle序列操作

    2019-03-09 21:29:50
    在很多数据库里都存在自动增长列的数据类型,几乎所有的关系型数据库都支持自动增长列的操作,但是只有oracle特殊,只有oracle 12c版本之后才提供自动增长列,在此之前都是用序列的方式来处理。 序列的创建语法: ...
  • Oracle序列

    千次阅读 2019-01-04 23:58:58
     序列是用来生成唯一,连续的整数的数据库对象,在Oracle中没有identity约束,通常就使用序列来自动生成主键或唯一键的值.序列可以按升序排列,也可以按降序排列. 二.常用用法  1.创建序列语法:Create sequence 序列...
  • Hibernate通过注解配置Oracle序列

    千次阅读 2018-07-11 17:51:43
    1.创建Oracle序列create sequence seq_id increment by 1 start with 1 maxvalue 999999999;2.在实体类主键的get方法上面添加注解@Id @SequenceGenerator(name="gen",sequenceName="SEQ_ID" ,...
  • 一个快速的JPA + Oracle序列示例,仅供参考。 1. Oracle数据库 发出以下SQL脚本以创建表和序列。 CREATE TABLE CUSTOMER( ID NUMBER(10) NOT NULL, NAME VARCHAR2(100) NOT NULL, EMAIL VARCHAR2(100) NOT ...
  • oracle 序列的创建删除

    2014-09-24 10:44:03
    在开始讲解Oracle序列使用方法之前,先加一点关于Oracle client sqlplus的使用,就是如果执行多行语句的话一定要加“/”才能表示结束,并执行!本篇文章的主题是通过创建Oracle序列和触发器实现表的主键自增。 1....
  • 在开始讲解Oracle序列使用方法之前,先加一点关于Oracle client sqlplus的使用,就是如果执行多行语句的话一定要加“/”才能表示结束,并执行!本篇文章的主题是通过创建Oracle序列和触发器实现表的主键自增。 1....
  • 修改Oracle序列

    2019-07-27 17:44:36
    数组库的主键Id用序列自动生成的,但是测试环境导入生产环境的数据库,而序列没有同步过来导致,当前序列的值小于数据库中数据的Id,使得每次新增数据的时候后台总会抛出主键唯一性的异常。 处理方法: -- 查询当前...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 104,462
精华内容 41,784
关键字:

oracle序列