原文题目:
Oracle创建自增字段方法-ORACLE SEQUENCE的简单介绍(转)
先假设有这么一个表:
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,上面的代码就可以实现自动递增的功能了。
分享到:
相关推荐
3.4 创建对象-关系映射文件 52 3.4.1 映射文件的文档类型定义(DTD) 52 3.4.2 把Customer持久化类映射到CUSTOMERS表 54 3.5 通过Hibernate API操纵数据库 58 3.5.1 Hibernate的初始化 61 3.5.2 访问Hibernate...
3.4 创建对象-关系映射文件 52 3.4.1 映射文件的文档类型定义(DTD) 52 3.4.2 把Customer持久化类映射到CUSTOMERS表 54 3.5 通过Hibernate API操纵数据库 58 3.5.1 Hibernate的初始化 61 3.5.2 访问Hibernate...
3.4 创建对象-关系映射文件 3.4.1 映射文件的文档类型定义(DTD) 3.4.2 把Customer持久化类映射到CUSTOMERS表 3.5 通过Hibernate API操纵数据库 3.5.1 Hibernate的初始化 3.5.2 访问Hibernate的Session...
##### 3.4 编译程序 - 通过菜单中的**编译**选项。 - 快捷键F5可以直接编译当前文件。 ##### 3.5 置换变量 - 支持使用特定语法声明和使用置换变量。 - 例如:`v_variable_name IN VARCHAR2`。 #### 四、测试程序 #...
**3.4 部署视图(Deployment View)** 部署视图描述了系统的物理部署情况,也是可选部分。 **3.5 数据视图(Data View)** 数据视图描述了系统的数据结构和数据流,同样是可选项。 #### 四、设计工具的使用 **4.1 ...
3.4 创建对象-关系映射文件 3.4.1 映射文件的文档类型定义(DTD) 3.4.2 把Customer持久化类映射到CUSTOMERS表 3.5 通过Hibernate API操纵数据库 3.5.1 Hibernate的初始化 3.5.2 访问Hibernate的Session...
3.4 创建对象-关系映射文件 3.4.1 映射文件的文档类型定义(DTD) 3.4.2 把Customer持久化类映射到CUSTOMERS表 3.5 通过Hibernate API操纵数据库 3.5.1 Hibernate的初始化 3.5.2 访问Hibernate的Session...
3.4 创建对象-关系映射文件 3.4.1 映射文件的文档类型定义(DTD) 3.4.2 把Customer持久化类映射到CUSTOMERS表 3.5 通过Hibernate API操纵数据库 3.5.1 Hibernate的初始化 3.5.2 访问Hibernate的Session...
- **模式对象**: 包括表、视图、聚集、索引、程序单元等。 - 表:存储数据的基本单位。 - 视图:根据一个或多个表的查询结果创建的虚拟表。 - 聚集:一组相关表的集合。 - 索引:用于加速数据检索的特殊数据结构...
在Java开发环境中,Hibernate作为一款优秀的对象关系映射(Object-Relational Mapping,简称ORM)框架,极大地简化了数据库操作过程。本文将深入探讨Hibernate配置文件的相关知识点,帮助开发者更好地理解其结构与...
设计模式是解决特定问题的一系列经验总结,提供了在特定情况下如何设计类和对象的有效方案。 #### 4.2 数据库设计 面向对象的设计也可以应用于数据库设计中,通过使用面向对象的语言和关系数据库来实现面向对象的...
- **3.4 Trimming Space from the Ends of a String** - **知识点:** 介绍如何去除字符串两端的空白字符,如使用 `strip()` 方法。 - **3.5 Combining Strings** - **知识点:** 展示如何合并多个字符串,可以...
**3.4. 数字** - **整数**: `int` - **浮点数**: `float` - **复数**: `complex` - **创建**: ```python i = 10 f = 3.14 c = 2 + 3j ``` **3.5. list** - **定义**: 可变的有序序列。 - **创建**: ```...
|------ 3.4 文档,视,框架之间相互作用 |------ 3.5 利用序列化进行文件读写 |------ 3.6 MFC中所提供的各种视类介绍 +-- 第四章 窗口控件 |------ 4.1 Button |------ 4.2 Static Box |------ 4.3 Edit Box |----...
- **数据字典(Data Dictionary):** 存储关于数据库元数据的信息,包括所有模式对象的定义。 - **视图:** Oracle提供了多种视图来访问数据字典,例如DBA_TABLES、ALL_TABLES等。 **2.6 内存体系结构** - **系统...
- **3.2.2 控制分组(组操作)**:描述了如何将多个控制对象归类为一个组进行统一管理。 - **3.2.3 参数成组(参数)**:解释了如何将相似的参数组成一组以便于监控和调整。 ##### 3.3 操作面板 - **3.3.1 概述**:...
- **顺序图**(Sequence Diagram):用于展示对象之间的交互顺序,常用于描述系统中对象间的通信方式。 - **活动图**(Activity Diagram):表示工作流中的活动及其转换,常用来描述业务流程或程序控制流。 - **用例...
通过将异步编程抽象成简单的模式,Combine使得开发者能够更轻松地构建复杂的应用程序。 #### 1.2 Combine的基本概念 - **发布者(Publishers)**:发布者负责发送值和完成信号。 - **订阅者(Subscribers)**:订阅者...
- 修改数据库的归档模式,使用`ALTER DATABASE ARCHIVELOG`命令启用归档模式。 **3.15 如何修改Oracle数据库的SID** - 重新配置`init.ora`文件中的`SID`参数。 **3.16 Unix环境下如何实现自动备份** - 使用shell...