Oracle自增ID实现的具体操作步骤

我们今天是要和大家一起讨论的是Oracle自增ID实现,我对这一问题存在不解之处,前两天在相关网站看见的资料,觉得挺好,就拿出来供大家分享,希望会给你带来一些帮助在此方面。

创新互联建站是专业的正镶白网站建设公司,正镶白接单;提供成都做网站、网站建设,网页设计,网站设计,建网站,PHP网站建设等专业做网站服务;采用PHP框架,可快速的进行正镶白网站开发网页制作和功能扩展;专业做搜索引擎喜爱的网站,专业的做网站团队,希望更多企业前来合作!

首先,你要有一张表!

 
 
 
  1. CREATE TABLE example(  
  2. ID Number(4) NOT NULL PRIMARY KEY,  
  3. NAME VARCHAR(25),  
  4. PHONE VARCHAR(10),  
  5. ADDRESS VARCHAR(50) );  

然后,你需要一个自定义的sequence

CREATE SEQUENCE emp_sequence

INCREMENT BY 1 -- 每次加几个

START WITH 1 -- 从1开始计数

NOMAXVALUE -- 不设置最大值

NOCYCLE -- 一直累加,不循环

NOCACHE -- 不建缓冲区

以上代码完成了一个序列(sequence)的建立过程,名称为emp_sequence,范围是从1开始到无限大(无限大的程度是由你机器决定的),nocycle 是决定不循环,如果你设置了最大值那么你可以用cycle 会使seq到最大之后循环.对于nocache顺便说一下如果你给出了cache值那么系统将自动读取你的cache值大小个seq

,这样在反复操作时会加快运行速度,但如果遭遇意外情况如当机了或oracle死了,则下次取出的seq值将和上次的不连贯.(如果连不连贯无所谓建议用cache,因为时间就是金钱呀!跑题了!)

书接上文,你只有了表和序列还不够,还需要一个触发器来执行它!代码如下:

CREATE TRIGGER "触发器名称" BEFORE

 
 
 
  1. INSERT ON example FOR EACH ROW WHEN (new.id is null)  
  2. begin  
  3. select emp_sequence.nextval into: new.id from dual;  
  4. end;  

打完收工!下面你就试试插入数据吧!

 
 
 
  1. INSERT INTO example(Name,phone,address) Values('Cao','56498543','Heibei'); 

ORACLE SEQUENCE的简单介绍(自增长字段)- -

在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。

1、Create Sequence

你首先要有Create Sequence或者Create AnySequence权限,

 
 
 
  1. Create Sequence emp_sequence 

INCREMENT BY 1 --每次加几个

STARTWITH 1 --从1开始计数

NOMAXVALUE --不设置最大值

NOCYCLE --一直累加,不循环

CACHE10 ;

一旦定义了emp_sequence,你就可以用CURRVAL,NEXTVAL

CURRVAL=返回sequence的当前值

NEXTVAL=增加sequence的值,然后返回sequence值

比如:

 
 
 
  1. emp_sequence.CURRVAL  
  2. emp_sequence.NEXTVAL  

可以使用sequence的地方:

-不包含子查询、snapshot、VIEW的SELECT语句

-INSERT语句的子查询中

-INSERT语句的VALUES中

-UPDATE的SET中

可以看如下例子:

 
 
 
  1. INSERT INTO emp VALUES  
  2. (empseq.nextval,'LEWIS','CLERK',7902,SYSDATE,1200,NULL,20);  
  3. SELECT empseq.currval FROM DUAL;  

但是要注意的是:

第一次NEXTVAL返回的是初始值;随后的NEXTVAL会自动增加你定义的INCREMENTBY值,然后返回增加后的值。CURRVAL总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则会出错。一次NEXTVAL会增加一次SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。明白?

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

2、Alter Sequence

你或者是该sequence的owner,或者有ALTER ANYSEQUENCE权限才能改动sequence.可以alter除start至以外的所有sequence参数.如果想要改变start值,必须drop sequence再re-create.

Alter sequence的例子

 
 
 
  1. ALTER SEQUENCE emp_sequence  
  2. INCREMENT BY 10  
  3. MAXVALUE 10000  

CYCLE--到10000后从头开始

NOCACHE;

影响Sequence的初始化参数:

SEQUENCE_CACHE_ENTRIES=设置能同时被cache的sequence数目。

可以很简单的Drop Sequence

 
 
 
  1. DRO SEQUENCE order_seq; 

自增长及触发器:

如何在Oracle自增ID实现类似自动增加ID的功能?

我们经常在设计数据库的时候用一个系统自动分配的ID来作为我们的主键,但是在ORACLE中没有这样的功能,我们可以通过采取以下的功能实现自动增加ID的功能

1.首先创建sequence

 
 
 
  1. create sequence seq maxincrement by 1 

2.使用方法

 
 
 
  1. select seqmax.nextval ID from dual 

就得到了一个ID

如果把这个语句放在触发器中,就可以Oracle自增ID实现和mssql的自动增加ID相同的功能!

建表

 
 
 
  1. CREATE TABLE "SPORTS"."LINEUP"("ID" NUMBER NOT NULL,  
  2. "TYPE" NUMBER(3) NOT NULL,  
  3. "BODY" VARCHAR2(100) NOT NULL,  
  4. "HITS" NUMBER(10) DEFAULT 0 NOT NULL,  
  5. PRIMARYKEY("ID"))  
  6. TABLESPACE "TS_SPORTS"  

建序列

 
 
 
  1. CREATE SEQUENCE "SPORTS"."SPORTS_LINEUP_ID_SEQ" INCREMENT BY 1  
  2. START WITH 1 MAXVALUE 1.0E28 MINVALUE 1 NOCYCLE  
  3. CACHE 50 NOORDER  

建自动更新的触发器

 
 
 
  1. CREATE OR REPLACE TRIGGER "SPORTS"."SPORTS_LINEUP_ID_TRIGGER"  
  2. BEFORE INSERT ON "SPORTS"."LINEUP" FOR EACH ROW  
  3. DECLARE  
  4. next_id NUMBER;  
  5. BEGIN  
  6. --Get the next id number from the sequence  
  7. SELECT sports_lineup_id_seq.NEXTVAL INTO next_id FROM dual;  
  8. --Use the sequence number as the primarykey  
  9. --for there cord being inserted.  
  10. :new.id:=next_id;  
  11. END;  

建保护PRIMARYKEY的触发器

 
 
 
  1. CREATE OR REPLACE TRIGGER "SPORTS"."LINEUP_ID_UPDATE_TRIGGER"  
  2. BEFORE UPDATE OF "ID" ON "SPORTS"."LINEUP" FOR EACHROW  
  3. BEGIN  
  4. RAISE_APPLICATION_ERROR(-20000,  
  5. 'sports_lineup_id_update_trigger:Update sof the ID field'  
  6. ||'arenotallowed.');  
  7. END;  

建删除的触发器

 
 
 
  1. create or replace trigger tr_bis_exc_req_del  
  2. before delete  
  3. on bis_exc_req  
  4. referencing old as old new as new  
  5. for each row  
  6. begin  
  7. if :old.check_status = '3' then  
  8. raise_application_error (-20001,'*****!');  
  9. return;  
  10. end if;  
  11. end;  
  12. /  

建更新的触发器

 
 
 
  1. create or replace trigger tr_bis_exc_req_upd  
  2. before update  
  3. on bis_exc_req  
  4. referencing old as old new as new  
  5. for each row  
  6. begin  
  7. if :old.check_status = '3' then  
  8. raise_application_error (-20001,'*******!');  
  9. return;  
  10. end if;  
  11. end;   

当前文章:Oracle自增ID实现的具体操作步骤
网站链接:http://www.shufengxianlan.com/qtweb/news47/43347.html

网站建设、网络推广公司-创新互联,是专注品牌与效果的网站制作,网络营销seo公司;服务项目有等

广告

声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联