视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
ORACLE SEQUENCE的简单介绍(自增长字段)
2025-09-27 16:06:06 责编:小OO
文档
在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。 

1、Create Sequence 

你首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限, 

CREATE SEQUENCE emp_sequence 

INCREMENT BY 1 -- 每次加几个 

START WITH 1 -- 从1开始计数 

NOMAXVALUE -- 不设置最大值 

NOCYCLE -- 一直累加,不循环 

CACHE 10; 

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

CURRVAL=返回 sequence的当前值 

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

比如: 

emp_sequence.CURRVAL 

emp_sequence.NEXTVAL 

可以使用sequence的地方: 

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

- INSERT语句的子查询中 

- NSERT语句的VALUES中 

- UPDATE 的 SET中 

可以看如下例子: 

INSERT INTO emp VALUES 

(empseq.nextval, 'LEWIS', 'CLERK',7902, SYSDATE, 1200, NULL, 20); 

SELECT empseq.currval FROM DUAL; 

但是要注意的是: 

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

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

2、Alter Sequence 

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

Alter sequence 的例子 

ALTER SEQUENCE emp_sequence 

INCREMENT BY 10 

MAXVALUE 10000 

CYCLE -- 到10000后从头开始 

NOCACHE ; 

影响Sequence的初始化参数: 

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

可以很简单的Drop Sequence 

DROP SEQUENCE order_seq; 

好吧,就到这里。 

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

自增长及触发器: 

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

整理编辑:China ASP 

我们经常在设计数据库的时候用一个系统自动分配的ID来作为我们的主键,但是在ORACLE 中没有这样的 

功能,我们可以通过采取以下的功能实现自动增加ID的功能 

1.首先创建 sequence 

create sequence seqmax increment by 1 

2.使用方法 

select seqmax.nextval ID from dual 

就得到了一个ID 

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

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

由 macro 发布于: 2001-04-13 14:44 

作者:Macro Zeng 

### 建表 ### 

CREATE TABLE "SPORTS"."LINEUP"("ID" NUMBER NOT NULL, "TYPE" 

NUMBER(3) NOT NULL, "BODY" VARCHAR2(100) NOT NULL, "HITS" NUMBER( 

10) DEFAULT 0 NOT NULL, PRIMARY KEY("ID")) 

TABLESPACE "TS_SPORTS" 

### 建序列 ### 

CREATE SEQUENCE "SPORTS"."SPORTS_LINEUP_ID_SEQ" INCREMENT BY 1 

START WITH 1 MAXVALUE 1.0E28 MINVALUE 1 NOCYCLE 

CACHE 50 NOORDER 

### 建自动更新的触发器 ### 

CREATE OR REPLACE TRIGGER "SPORTS"."SPORTS_LINEUP_ID_TRIGGER" 

BEFORE INSERT 

ON "SPORTS"."LINEUP" 

FOR EACH ROW 

DECLARE 

next_id NUMBER; 

BEGIN 

--Get the next id number from the sequence 

SELECT sports_lineup_id_seq.NEXTVAL 

INTO next_id 

FROM dual; 

--Use the sequence number as the primary key 

--for the record being inserted. 

:new.id := next_id; 

END; 

### 建保护 PRIMARY KEY 的触发器 ### 

CREATE OR REPLACE TRIGGER "SPORTS"."LINEUP_ID_UPDATE_TRIGGER" 

BEFORE UPDATE OF "ID" ON "SPORTS"."LINEUP" 

FOR EACH ROW 

BEGIN 

RAISE_APPLICATION_ERROR (-20000, 

'sports_lineup_id_update_trigger : Updates of the ID field' 

|| 'are not allowed. '); 

END;下载本文

显示全文
专题