`
Wen_JN_86
  • 浏览: 33734 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Oracle-Sequence

阅读更多

 

Oracle sequence介绍:创建自增字段方法

先假设有这么一个表:

createtableS_Depart(
DepartIdINTnotnull,
DepartNameNVARCHAR2(40)notnull,
DepartOrderINTdefault0,
constraintPK_S_DEPARTprimarykey(DepartId)
);

 

在oracle中sequence就是所谓的序列号,每次取的时候它会自动增加,一般用在需要按序列号排序的地方。
1、CreateSequence
你首先要有CREATESEQUENCE或者CREATE ANY SEQUENCE权限,
CREATE SEQUENCE emp_sequence
INCREMENT BY 1 -- 每次加几个
START WITH 1 -- 从1开始计数
NOMAXvalue -- 不设置最大值
NOCYCLE -- 一直累加,不循环
CACHE 10; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE
针对S_Depart创建的sequence如下:

createsequenceS_S_DEPART
minvalue1
maxvalue999999999999999999999999999
startwith1
incrementby1
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中

可以看如下例子:

insertintoS_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、AlterSequence
你或者是该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数目。

可以很简单的DropSequence
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 onS_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中实现类似自动增加ID 的功能?
整理编辑:ChinaASP
我们经常在设计数据库的时候用一个系统自动分配的ID来作为我们的主键,但是在ORACLE 中没有这样的
功能,我们可以通过采取以下的功能实现自动增加ID的功能
1.首先创建sequence
create sequence seqmax increment by 1
2.使用方法
select seqmax.nextval ID from dual
就得到了一个ID
如果把这个语句放在 触发器中,就可以实现和ms sql 的自动增加ID相同的功能!
-------------------------------------------------------------------------
举例:


### 建表###
CREATE TABLE "SPORTS"."LINEUP"("ID" NUMBER NOTNULL, "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" INCREMENTBY 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. ');

分享到:
评论

相关推荐

    Oracle创建自增字段方法-ORACLE SEQUENCE的简单介绍

    Oracle 创建自增字段方法-ORACLE SEQUENCE 的简单介绍 Oracle SEQUENCE 是一种特殊的数据库对象,用于生成一系列唯一的数值,通常用于主键或其他需要唯一标识的字段。下面将详细介绍 Oracle 创建自增字段方法-...

    oracle中sequence介绍及应用

    ### Oracle中的Sequence介绍及应用 #### 一、Sequence概述 在Oracle数据库中,Sequence是一种用于自动产生数值序列的对象。它可以生成连续的整数或者非连续的整数序列,并且可以根据需求进行递增或递减。Sequence...

    Oracle sequence 重置(失效恢复)

    ### Oracle Sequence 重置(失效恢复) 在进行Oracle数据库移植或维护时,可能会遇到Sequence失效的问题。这种情况通常发生在数据迁移后,原有的Sequence不再与表中的最大值相匹配,导致新记录插入时出现ID冲突或者...

    Hibernate主键策略-sequence

    在本篇内容中,我们将深入探讨"Hibernate主键策略-sequence",并结合标签中的"源码"和"工具",分析其工作原理和实际应用。 首先,让我们理解什么是序列(Sequence)。在关系型数据库中,如Oracle、PostgreSQL等,...

    京东金融数据库开发管理规范-SEQUENCE

    - 如果命名的长度超过了Oracle的规定(通常为30个字符),则表名与字段名可以采用缩写的方式。 2. **格式规范** - 在创建和删除序列时,需要遵循一定的格式规范,以确保代码的一致性和可读性。 - **创建序列的...

    使用JDeveloper开发WEB应用时同时使用Oracle的sequence和trigger

    本篇将重点介绍如何在使用JDeveloper这款强大的集成开发环境(IDE)时,结合Oracle的sequence和trigger来实现高效的数据操作。 首先,让我们理解一下sequence和trigger的概念。在Oracle中,sequence是一种自动递增...

    oracle中的sequence实现主键增长

    Oracle中的Sequence是数据库管理系统提供的一种机制,用于生成序列化的整数,通常用于主键或唯一标识符,确保数据的唯一性和有序性。在Oracle中,Sequence不同于其他数据库系统的自增字段,例如SQL Server中的`...

    oracle-use.rar_Oracle drop use_oracle

    如果表中的某个字段是`ID`并且设置为自增(通常使用`IDENTITY`或`SEQUENCE`实现),那么在插入时,这个字段的值会自动递增,无需手动输入。 "选出字段是否包含字母"涉及字符串函数的使用,例如`REGEXP_LIKE`可以...

    数据库-oracle-学习之路.docx

    在Oracle中,可以通过自增序列(如`CREATE SEQUENCE`)来生成主键,或者在创建表时直接定义主键字段,如`ID NUMBER PRIMARY KEY`. 3. **数据库空间查询**: - 表空间(Tablespaces)是Oracle数据库中存储数据和...

    浅谈MyBatis-Plus学习之Oracle的主键Sequence设置的方法

    在Oracle数据库中,由于不支持自动递增的主键策略,开发者通常会使用Sequence来生成主键值。本文将深入探讨如何在MyBatis-Plus(MP)框架中配置Oracle的主键Sequence。 首先,Oracle Sequence是Oracle数据库提供的...

    ORACLE SEQUENCE的简单介绍

    ### ORACLE SEQUENCE 的详细介绍与应用 #### 一、概述 在数据库开发和管理中,自动编号是一项常用的功能。在 SQL Server 中,我们可以通过自增字段来实现这一功能。而在 Oracle 数据库中,则使用了一个名为 **...

    Oracle-实验七.docx

    `CREATE SEQUENCE`定义一个序列,`SELECT NEXTVAL FROM dual`获取下一个值,`ALTER SEQUENCE`修改序列属性,`DROP SEQUENCE`删除序列。序列可以在插入数据时自动化地提供新的唯一标识符。 实验内容还涵盖了使用OEM...

    oracle -sqlloader使用方法

    (rec_no "my_db_sequence.nextval", region constant '31', time_loaded "to_char(sysdate,'HH24:MI')", data1 position(1:5)":data1/100", data2 position(6:15)"upper(:data2)", data3 position(16:22)"to_date(:...

    Oracle-数据库所有查询命令【精排版】

    - **序列**: `CREATE SEQUENCE`用于创建一个序列,它按照指定的顺序生成一组唯一的数字。 - **索引**: `CREATE INDEX`用于创建索引,它提高查询性能,但会增加数据修改的成本。 ### PL/SQL基础 - **匿名块**: PL/...

    oracle_sequence.rar_oracle

    在Oracle中,序列(Sequence)是一个非常重要的概念,它主要用于生成唯一的整数序列,常常被用来作为主键值,特别是在插入新记录时自动增加。在本篇文章中,我们将深入探讨Oracle序列的创建、使用以及其在实际应用中...

    oracle 主键自增 sequence

    ### Oracle 主键自增 Sequence 的实现与应用 #### 一、Sequence 的概念及用途 在 Oracle 数据库中,`Sequence` 是一种用于生成一系列唯一数值的对象。这些数值可以按照特定的规则递增或递减,并且可以设定是否循环...

    系列之三:ORACLE-EBS系统应用基础概述

    九、单据编号(Document Sequence) ORACLE EBS 系统中的单据编号功能可以用于实现业务文档的自动编号和管理。这种方式可以避免了手动编号的错误和不一致问题。 十、工作流(Workflow) ORACLE EBS 系统中的工作流...

    oracle-impdp&expdp总结

    grant create sequence to PROMOTION; grant create session to PROMOTION; grant drop any table to PROMOTION; grant drop any trigger to PROMOTION; grant drop any type to PROMOTION; grant drop any view to ...

    oracle e-business suite 功能流程详解

    在IT领域,Oracle E-Business Suite(EBS)作为一款集成的企业资源规划(ERP)解决方案,为全球众多企业提供了一站式的财务管理、供应链管理和人力资源管理等服务。本文将深入解析Oracle EBS的功能流程,特别是其在...

    (word完整版)ORACLE-EBS-系统应用基础概述.doc

    八、单据编号(Document Sequence) 单据编号系统自动为各种业务文档(如发票、订单等)生成唯一的序列号,确保数据的唯一性和可追踪性。 九、工作流(Workflow) 工作流是EBS中的自动化过程管理工具,它可以定义...

Global site tag (gtag.js) - Google Analytics