Oracle 使用序列创建自增字段

来源:互联网 发布:如何申请淘宝账号步骤 编辑:程序博客网 时间:2024/05/22 00:35
       在Oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。 
        1、Create Sequence 
        你首先要有create sequence或者create any sequence权限 
Sql代码  收藏代码
  1. CREATE SEQUENCE SEQ_EMP  
  2. INCREMENT BY 1 -- 每次加几个   
  3. START WITH 1 -- 从1开始计数   
  4. NOMAXVALUE -- 不设置最大值 (MAXVALUE 99999999)  
  5. NOCYCLE -- 一直累加,不循环   
  6. CACHE 10; --设置缓存CACHE个序列,如果系统DOWN掉了或者其它情况将会导致序列不连续,也可以设置为NOCACHE  

        针对SEQ_EMP创建的sequence如下: 
Sql代码  收藏代码
  1. CREATE SEQUENCE SEQ_EMP  
  2. MINVALUE 1  
  3. MAXVALUE 99999999  
  4. START WITH 1  
  5. INCREMENT BY 1  
  6. NOCACHE;  

        一旦定义了SEQ_EMP,你就可以用currval,nextval 
        currval=返回 sequence的当前值 
        nextval=增加sequence的值,然后返回 sequence 值 
        比如: 
        SEQ_EMP.CURRVAL 
        SEQ_EMP.NEXTVAL 

        可以使用sequence的地方: 
        - 不包含子查询、snapshot、view的 select 语句 
        - INSERT语句的子查询中 
        - NSERT语句的values中 
        - UPDATE 的 set中 

        可以看如下例子: 
Sql代码  收藏代码
  1. INSERT INTO T_EMPLOYEE(ID,NAME,ORDER)VALUES(SEQ_EMP.NEXTVAL,'WANG',100);  


        2、修改序列(Alter Sequence ) 
         你或者是该sequence的owner,或者有ALTER ANY SEQUENCE 权限才能改动sequence. 可以修改(alter)除start至以外的所有sequence参数.如果想要改变start值,必须删除序列( drop sequence ),再重新创建 (re-create ). 
        Alter sequence 的例子 
Sql代码  收藏代码
  1. ALTER SEQUENCE SEQ_EMP  
  2. INCREMENT BY 10   
  3. MAXVALUE 10000   
  4. CYCLE -- 到10000后从头开始   
  5. NOCACHE ;   

         影响Sequence的初始化参数: 
         SEQUENCE_CACHE_ENTRIES =设置能同时被cache的sequence数目。 

        3、删除序列 
        简单的Drop Sequence 
Sql代码  收藏代码
  1. drop sequence SEQ_EMP;   


        下面是一个简单例子: 
Sql代码  收藏代码
  1. CREATE SEQUENCE SEQ_EMP  
  2. MINVALUE 1  
  3. MAXVALUE 99999999  
  4. START WITH 1  
  5. INCREMENT BY 1  
  6. NOCACHE  
  7. ORDER;  

        建立解发器代码为: 
Sql代码  收藏代码
  1. CREATE OR REPLACE TRIGGER TRI_EMP_ID --触发器名称  
  2.   BEFORE INSERT ON T_EMPLOYEE    --T_EMPLOYEE是表名  
  3.   FOR EACH ROW  
  4. DECLARE  
  5.    NEXTID NUMBER;  
  6. BEGIN  
  7.   IF :NEW.ID IS NULL OR :NEW.ID=0 THEN --ID是列名  
  8.     SELECT SEQ_EMP.NEXTVAL --SEQ_EMP正是刚才创建的序列  
  9.     INTO NEXTID  
  10.     FROM SYS.DUAL;  
  11.      :NEW.ID:=NEXTID;  
  12.   END IF;  
  13. END TRI_EMP_ID;  

上面的代码就可以实现id自动递增的功能了。