day12_序列——oracle主键自动增加

       
ORACLE SEQUENCE用法
在oracle中sequence就是序号,每次取的时候它会自动增加。

1、Create Sequence
    首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限。
    创建语句如下: 
 

CREATE SEQUENCE seqTest
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXvalue -- 不设置最大值    
NOCYCLE -- 一直累加,不循环
CACHE 10; 

如果你给出了cache值那么系统将自动读取你的cache值大小个seq,这样在反复操作时会加快运行速度。
但如果遭遇意外情况如当机了或oracle死了,则下次取出的seq值将和上次的不连贯。
(如果连不连贯无所谓,建议用cache,因为时间就是金钱呀!) 

1  2         3-13内存

从14开始

 
 
 
 
2、得到Sequence值 
定义好sequence后,你就可以用currVal,nextVal取得值。
    CurrVal:返回 sequence的当前值 
    NextVal:增加sequence的值,然后返回 增加后sequence值 
    
  得到值语句如下:
SELECT Sequence名称.CurrVal FROM DUAL; 

  如得到上边创建Sequence值的语句为:
select seqtest.currval from dual;
select seqtest.nextVal from dual; 
 
 
 
3、Alter Sequence 
    拥有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.
    如果想要改变start值,必须 drop sequence 再 re-create。
 
例:
alter sequence SEQTEST maxvalue 9999999;

 
 
 
 
4、Drop Sequence
DROP SEQUENCE seqTest; 
 
 
 


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

--首先建一个表TEST
create table TEST
(
  NID int PRIMARY KEY,
  test1 varchar2(20)
);

-- 再建一个序列SEQ_TEST 


create sequence SEQ_TEST
minvalue 1        --最小值
nomaxvalue        --不设置最大值
start with 1      --从1开始计数
increment by 1    --每次加1个
nocycle           --一直累加,不循环
nocache;          --不建缓冲区


 create sequence SEQ_TEST
    minvalue 1  
    nomaxvalue
    start with 1
    increment by 1
    nocycle   
    nocache;



序列(sequence)的名称为SEQ_TEST,范围是从1开始到无限大,
nocycle 一直累加,不循环。如果你设置了最大值那么你可以用cycle,会使seq到最大之后循环使用。


CREATE OR REPLACE TRIGGER tg_test
BEFORE INSERT ON test FOR EACH ROW WHEN (new.nid is null)
begin
select seq_test.nextval into:new.nid from dual;
end;
/

 
 
    注::new 代表 数据改变后的新值,相对应的有 :old 原值
          := 代表 赋值
          :nextid表示引用sqlplus中定义的变量 







      下面是测试

select * from test;
insert into test(nid,test1) values(6,'aaa');
insert into test(test1) values('bbb');

 

二、唯一序列

        SYS_GUID() 生成32位的唯一编码。

        序列生成器所生成的数字只能保证在单个实例里是唯一的,这就不适合将它用作并行或者远程环境里的主关键字,因为各自环境里的序列可能会生成相同的数字,从而导致冲突的发生。SYS_GUID会保证它创建的标识符在每个数据库里都是唯一的。
        此外,序列必须是DML陈述式的一部分,因此它需要一个到数据库的往返过程(否则它就不能保证其值是唯一的)。SYS_GUID源自不需要对数据库进行访问的时间戳和机器标识符,这就节省了查询的消耗。

        很多应用程序都依靠序列生成器来创建数据行的主关键字,这些数据行没有一个明显的主值,这也就是说,在这样的数据集里一条记录的创建就会让数据列发生改变。因此,管理员可能会对在表格中将SYS_GUID用作主关键字而不使用序列数感兴趣。这在对象在不同机器的不同数据库里生成以及需要在后来合并到一起的情况下很有用。

        使用SYS_GUID或者序列会在数据库使用周期里的某些地方造成性能上的消耗;问题就是在哪里。对于SYS_GUID而言,性能上的影响在查询时间和创建时间上(在表格里要创建更多的块和索引以容纳数据)。对序列而言,性能上的影响在查询期间,在这个时候,SGA序列的缓冲区被用光。在缺省情况下,一个序列一次会缓冲20个值。如果数据库没有使用这些值就关闭了,它们就会被丢失。

        SYS_GUID生成的值的另一个显著的不足之处是,管理这些值会变得困难得多。你必须(手动)输入它们或者通过脚本来填充它们,或者将它们作为Web参数来传递。出于这些原因,将SYS_GUID作为一个主关键字不是一个很好主意,除非是在一个并行的环境里或者希望避免使用管理序列生成器的情况下。          
        
     
     create table haha(id varchar2(100) primary key);
   insert into haha values(SYS_GUID());   
                             




原文地址:https://www.cnblogs.com/xiaoxiao5ya/p/f27fca21b001895b8fb1617c72900069.html