Oracle使用序列创建自增字段
### Oracle 使用序列创建自增字段 在数据库设计与开发中,自增字段是十分常见的需求之一,尤其是在需要为每一行记录自动分配一个唯一编号的情况下。Oracle 数据库通过序列(Sequence)这一特性支持自增字段的实现。本文将详细介绍如何利用 Oracle 的序列功能来创建自增字段,并探讨其相关的配置选项及应用场景。 ### 创建序列 (Create Sequence) #### 基本语法与示例 在 Oracle 中,序列是一个用于生成一系列数字的对象,通常用于为表中的某一列提供连续的数值。创建序列的基本语法如下: ```sql CREATE SEQUENCE sequence_name INCREMENT BY increment_value -- 指定每次生成的增量值 START WITH start_value -- 指定序列起始值 MAXVALUE max_value -- 指定序列的最大值,默认为无最大值 MINVALUE min_value -- 指定序列的最小值,默认为 1 NOCYCLE -- 表示序列达到最大或最小值后不再循环 CACHE cache_size; -- 缓存预先生成的序列值数量 ``` 例如,以下 SQL 语句创建了一个名为 `SEQ_EMP` 的序列: ```sql CREATE SEQUENCE SEQ_EMP INCREMENT BY 1 START WITH 1 NOMAXVALUE NOCYCLE CACHE 10; ``` 这里指定了序列的起始值为 1,每次递增 1,没有设置最大值,不会循环,并且缓存了 10 个值。 #### 序列的 CURRVAL 和 NEXTVAL 属性 - **CURRVAL**:表示序列当前的值。 - **NEXTVAL**:返回序列的下一个值,并更新序列的当前值。 例如,执行 `SEQ_EMP.NEXTVAL` 将会返回序列的下一个值,并使当前值变为这个新值;而 `SEQ_EMP.CURRVAL` 则返回序列的当前值。 ### 修改序列 (Alter Sequence) 如果需要对已创建的序列进行修改,可以使用 ALTER SEQUENCE 语句。这允许用户更改序列的一些属性,如增量、最大值、是否循环等。需要注意的是,并非所有序列属性都可以被修改,例如起始值不能直接修改,若需改变起始值,则需要先删除序列再重新创建。 以下是一个修改 `SEQ_EMP` 序列的例子: ```sql ALTER SEQUENCE SEQ_EMP INCREMENT BY 10 MAXVALUE 10000 CYCLE -- 达到最大值后重新从最小值开始 NOCACHE; ``` ### 删除序列 (Drop Sequence) 如果序列不再需要,可以通过 DROP SEQUENCE 语句将其从数据库中删除。例如: ```sql DROP SEQUENCE SEQ_EMP; ``` ### 使用示例 假设有一个员工表 `T_EMPLOYEE` 需要一个自增的 ID 字段,我们可以这样使用序列: ```sql INSERT INTO T_EMPLOYEE (ID, NAME, ORDER) VALUES (SEQ_EMP.NEXTVAL, 'WANG', 100); ``` 此外,还可以通过触发器来自动为表中的字段赋值,避免手动插入时忘记指定 ID: ```sql CREATE OR REPLACE TRIGGER TRI_EMP_ID BEFORE INSERT ON T_EMPLOYEE FOR EACH ROW DECLARE NEXTID NUMBER; BEGIN IF :NEW.ID IS NULL OR :NEW.ID = 0 THEN SELECT SEQ_EMP.NEXTVAL INTO NEXTID FROM DUAL; :NEW.ID := NEXTID; END IF; END TRI_EMP_ID; ``` ### 性能与缓存考虑 - **CACHE**:缓存预先生成的序列值数量,可以提高性能,但若系统崩溃可能会导致跳号。 - **NOCACHE**:不缓存序列值,虽然性能较低但更安全。 ### 结论 Oracle 序列是一个非常实用的功能,它能够方便地为表中的某列提供自动增长的数值。通过对序列的各种配置选项的理解和掌握,可以更好地满足不同的业务场景需求。希望本文对您理解并运用 Oracle 序列有所帮助。




























1、Create Sequence
你首先要有create sequence或者create any sequence权限
Sql代码
CREATE SEQUENCE SEQ_EMP
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXVALUE -- 不设置最大值 (MAXVALUE 99999999)
NOCYCLE -- 一直累加,不循环
CACHE 10; --设置缓存CACHE个序列,如果系统DOWN掉了或者其它情况将会导致序列不连续,也可以设置为NOCACHE
针对SEQ_EMP创建的sequence如下:
Sql代码
CREATE SEQUENCE SEQ_EMP
MINVALUE 1
MAXVALUE 99999999
START WITH 1
INCREMENT BY 1
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中
可以看如下例子:


- 粉丝: 0
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助


最新资源
- 网络爆红护士辞职信如何写.docx
- 2025年转让软件著作权协议.docx
- java实训心得三百字(优秀7篇).docx
- 2017年贯标项目管理手册.doc
- 数控技术分析研究方案1机械制造及其自动化0.doc
- 热工自动化技术的现状与发展.doc
- 【精品课件】算法的三种基本结构.pptx
- 数值分析研究实习作业三(C语言详细注释).doc
- 网络技术在小学数学中的应用.doc
- 网站客服经理年底总结(九).doc
- 最新工程项目管理年度总结-工程项目管理总结报告(二十篇).docx
- 网络配送合作协议书.docx
- 大学生创业网站策划书.doc
- 厦门大学校园无线网络招标标书.doc
- 软件工程实训报告心得体会-软件专业实训心得体会(四篇).docx
- 基于策略的ip网络的qos研究毕业论文.doc


