Oracle创建自增字段--ORACLE SEQUENCE的简单使用介绍

 更新时间:2013年03月25日 15:55:07   作者:  
在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方接下来为大家介绍下Oracle创建自增字段方法感兴趣的各位可不要错过了哈
先假设有这么一个表:
复制代码 代码如下:

create table S_Depart (
DepartId INT not null,
DepartName NVARCHAR2(40) not null,
DepartOrder INT default 0,
constraint PK_S_DEPART primary key (DepartId)
);

在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; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE
针对S_Depart创建的sequence如下:
复制代码 代码如下:

create sequence S_S_DEPART
minvalue 1
maxvalue 999999999999999999999999999
start with 1
increment by 1
nocache;

一旦定义了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 S_Depart(departId,Departname,Departorder)values(S_S_Depart.Nextval,'12345',1);

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;
一个简单的例子
复制代码 代码如下:

create sequence SEQ_ID
minvalue 1
maxvalue 99999999
start with 1
increment by 1
nocache
order;

建解发器代码为
复制代码 代码如下:

create or replace trigger tri_test_id
before insert on S_Depart --S_Depart 是表名
for each row
declare
nextid number;
begin
IF :new.DepartId IS NULLor :new.DepartId=0 THEN --DepartId是列名
select SEQ_ID.nextval --SEQ_ID正是刚才创建的
into nextid
from sys.dual;
:new.DepartId:=nextid;
end if;
end tri_test_id;

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

相关文章

  • oracle数据库如何使用exp和imp命令导入导出数据

    oracle数据库如何使用exp和imp命令导入导出数据

    这篇文章主要给大家介绍了关于oracle数据库如何使用exp和imp命令导入导出数据的相关资料,Oracle的EXP(Export)和 IMP(Import)是两个非常重要的命令,它们用于数据库的备份和恢复,需要的朋友可以参考下
    2024-07-07
  • 利用windows任务计划实现oracle的定期备份

    利用windows任务计划实现oracle的定期备份

    我们搞数据库管理系统的经常会遇到数据库定期自动备份的问题,有各种各样的方法,这里介绍一种利用windows任务计划实现oracle定期备份的方法供大家分享。
    2009-08-08
  • Oracle rac模式下undo表空间爆满的解决方案

    Oracle rac模式下undo表空间爆满的解决方案

    Oracle数据库中的Undo表空间是用于存储事务回滚信息的特殊表空间,它记录了数据库中执行的所有未提交事务的历史信息,以便在需要时进行回滚或恢复操作,在本文中,我们将深入探讨Oracle rac模式下undo表空间爆满的解决方案,需要的朋友可以参考下
    2024-09-09
  • 使用MySQL语句来查询Apache服务器日志的方法

    使用MySQL语句来查询Apache服务器日志的方法

    这篇文章主要介绍了使用MySQL语句来查询Apache服务器日志的方法,五个实例均基于Linux系统进行演示,需要的朋友可以参考下
    2015-06-06
  • Oracle数据库删除表空间后磁盘空间不释放的问题及解决

    Oracle数据库删除表空间后磁盘空间不释放的问题及解决

    这篇文章主要介绍了Oracle数据库删除表空间后磁盘空间不释放的问题及解决方案,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-11-11
  • Oracle11g调整SGA方法详解

    Oracle11g调整SGA方法详解

    这篇文章主要介绍了Oracle11gSGA调整方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-07-07
  • Oracle中行列转换有哪些方法

    Oracle中行列转换有哪些方法

    这篇文章主要给大家介绍了关于Oracle中行列转换有哪些方法的相关资料,最近在工作中遇到了涉及到数据库行列之间相互转换的问题,所以这里给大家总结介绍下,需要的朋友可以参考下
    2023-08-08
  • Oracle 数据库操作类

    Oracle 数据库操作类

    我有对Oracle最基本的数据库操作做了最为简单的归类,希望可以对后来者有所参考。另外,这个类需要有日志记录类(日志记录在Xml文档中),我会在后面的文中在贴出来。
    2009-08-08
  • Oracle除去数据中的换行符以免读取出现问题

    Oracle除去数据中的换行符以免读取出现问题

    将整条数据取出,并用特殊符号分割,如果数据出现换行的情况,那么读取时就有问题,这时就可以采用下面的方法来去除
    2014-07-07
  • Oracle归档日志文件(查看、配置、删除)

    Oracle归档日志文件(查看、配置、删除)

    归档日志是非活动的重做日志备份.通过使用归档日志,可以保留所有重做历史记录,本文主要介绍了Oracle归档日志文件(查看、配置、删除),具有一定的参考价值,感兴趣的可以了解一下
    2023-12-12

最新评论