`
k_lb
  • 浏览: 791973 次
  • 性别: Icon_minigender_1
  • 来自: 郑州
社区版块
存档分类
最新评论
  • kitleer: 据我所知,国内有款ETL调度监控工具TaskCTL,支持ket ...
    kettle调度

ORACLE 自增序列SEQUENCE

 
阅读更多


在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;

示例Sequence:
CREATE SEQUENCE SCOTT.DMIFPOSTID
START WITH 261
INCREMENT BY 1
NOMINVALUE
NOMAXVALUE
NOCYCLE
CACHE 20
NOORDER

3、如何使用
第一种方法:一般来说需要新建一个触发器(TRIGGER),使得在插入数据之前先运行Sequence生成自增号。
示例Trigger
CREATE OR REPLACE TRIGGER SCOTT.DMIFATTACH_TRG
BEFORE INSERT
ON SCOTT.DMIFATTACH
REFERENCING OLD AS OLD NEW AS NEW
FOR EACH ROW
begin
select SCOTT.DMIFATTACHID.nextval into :new.ATTACHID from dual;
end;
第二种方法:可以在插入数据时直接调用。
insert into table(id,name) values(seq_name.nextval,'名字');

其它:对于hibernate来说,在插入数据之前会先运行一次Sequence生成id的,所以这时如果还有触发器(TRIGGER),又要再运行一次Sequence,于是就会发现id是以2为步进增加的。这时把Trigger删除,步进就为1了。
如果使用hibernate则需要在hbm.xml文件中把ID的生成方式设为sequence.
<id
name="postid"
type="java.lang.Integer"
column="POSTID"
>
<meta attribute="field-description">
@hibernate.id
generator-class="sequence"
type="java.lang.Integer"
column="POSTID"


</meta>
<!--设置id生成方式-->
<generator class="sequence">
<param name="sequence">SCOTT.DMIFPOSTID</param>
</generator>
</id>
同时在调用this.getHibernateTemplate().save()方法时会自动生成根据sequence把查询到的id号set给这个对象的id.

要查看已创建的Sequence,执行的语句是:

SQL代码 select*fromuser_sequences;
其中返回的SEQUENCE_NAME为序列名,LAST_NUMBER为当前值
要取得下一ID,可以使用:
SQL代码 select序列名.nextvalfrom表名
这个语句会返回多个序列号(会被缓存起来),要取得一个序号,表名使用dual(虚表)即可
分享到:
评论

相关推荐

    MyBatis Oracle 自增序列的实现方法

    给大家分享MyBatis Oracle 自增序列的实现方法及mybatis配置oracle的主键自增长的方法,非常不错具有一定的参考借鉴价值,感兴趣的朋友一起看看吧

    如何实现Oracle自增,序列,触发器都有

    如何实现Oracle主键自增,通过写sequence和触发器,很全面,绝对帮你解决问题

    Oracle创建自增字段sequence

    Oracle中没有sqlserver中那么方便的自增序列,如果想要达到sqlserver中那种效果,也不是很麻烦,需要创建一个自增序列SEQUENCE,然后建一个触发器即可。  CREATE SEQUENCE emp_sequence  INCREMENT BY 1 — ...

    oracle 主键自增 sequence

    oracle 主键自增 给你个例子吧:看看肯定明白了!!! 首先,你要有一张表! CREATE TABLE example( ID Number(4) NOT NULL PRIMARY KEY, NAME VARCHAR(25), PHONE VARCHAR(10), ADDRESS VARCHAR(50) ); ...

    oracle迁移mysql自增序列问题

    今天从oracle迁移数据到mysql碰到个需求:原先的主键字段需要改成mysql中的自增字段,而且原先数据的值不能变,以后新插入的值从原先数据最大的值开始自增。 解决办法: 构建环境: mysql&gt; CREATE TABLE test -&gt; ( ...

    Oracle在表上建立自增字段的方法

    本方法为使用SEQUENCE...  1、建立自增序列TEMP_TEST_IDADD,命名任意,从1开始,每次加1  CREATE SEQUENCE TEMP_TEST_IDADD INCREMENT BY 1 START WITH 1;  2、在表temp_test上建立触发器如下  CREATE OR REPL

    oracle序列主键自增长

    当向表中插入数据时,主键值自动加一. 实现方法1: 建立一个最小为1,最大为nomaxvalue的一个序列号会自动循环的序列 create sequence 序列名 increment by 1 start with 1 nomaxvalue nocycle; .......

    Oracle数据库表序列ID自增生成器

    Oracle数据库表序列ID自增生成器的功能是为数据库中的表添加序列和触发器,以便使数据表的主键ID能够随着记录的增加而自动增加。

    在MySQL中创建实现自增的序列(Sequence)的教程

    由于mysql和oracle不太一样,不支持直接的sequence,所以需要创建一张table来模拟sequence的功能,理由sql语句如下: 第一步:创建–Sequence 管理表 DROP TABLE IF EXISTS sequence; CREATE TABLE sequence ( ...

    Oracle数据库中创建自增主键的实例教程

    在设计数据库表的时候发现Oracle没有自增主键的设置,Google了解到Oracle本身并不支持自增主键,需要通过序列(Sequence)和...创建序列Sequence Create Sequence SEQ_STUDENT minvalue 1 maxvalue 99999999999999

    简单三步轻松实现ORACLE字段自增

    代码如下: create table Test_Table ( ID number(11) primary key, Name varchar(50) not null, Value1 varchar(50) not null ) 第二步:创建一个自增序列以此提供调用函数。 代码如下: create sequence AutoID ...

    Oracle中使用触发器(trigger)和序列(sequence)模拟实现自增列实例

    问题:在SQL Server数据库中,有自增列这个字段属性,使用起来也是很方便的。而在Oracle中却没有这个功能,该如何实现呢? 答:在Oracle中虽然没有自增...2、建立序列SEQUENCE 代码如下: create sequence user_seq in

    oracle数据库主键自增并且返回主键值

    create sequence seq_users ##创建序列seq_users increment by 1 ## 步长,每次加1 start with 1 ##从1开始 minvalue 1 ##最小值 maxvalue 9999999 ##最大值 order ##确保按照请求次序生成整数 【不常用的设置】....

    Oracle创建主键自增表(sql语句实现)及触发器应用

    2、创建自动增长序列 代码如下: CREATESEQUENCETestIncrease_Sequence INCREMENTBY1–每次加几个 STARTWITH1–从1开始计数 NOMAXVALUE–不设置最大值,设置最大值:maxvalue9999 NOCYCLE–一直累加,不循环 CACHE10...

    Oracle 实现类似SQL Server中自增字段的一个办法

    由于Oracle中没有类似SQL Server中的自增字段,所以我们如果想要通过设定类似ID性质的唯一列的话,需要借助Oracle的sequence,先建立一个序列,然后在每次插入数据的时候,通过前触发器来更新ID值,并将序列的序号加...

    sqlserver实现oracle的sequence方法

    当然你也许还会说,最Sql的方式是采用identity列,自增的方式去增加就ok了。但是这样的列如果要实现“YYYYMMDD”+Sequence值 (例如:2008072400001)的格式就不行了。还是老老实实用存储过程来取得一个Sequence值吧...

    Oracle数字类型number自增的实现代码

    创建序列 create sequence seq_student start with 6 increment by 1 maxvalue 500 nominvalue nocycle nocache; 创建触发器 create or replace trigger trigger_student before insert on student for each row ...

    oracle设置主键自动增长

     以上代码完成了一个序列(sequence)的建立过程,名称为emp_sequence,范围是从1开始到无限大(无限大的程度是由你机器决定的),nocycle 是决定不循环,假如你设置了最大值那么你可以用cycle 会使seq到最大之后循环....

    ORACLE实现字段自增示例说明

    Password varchar(11) not null ) 然后就是创建一个序列 代码如下: create sequence autoid start with 1 increment by 1 minvalue 1 nomaxvalue 然后在插入记录的时候就可以调用上面创建的序列来实现字段的自增了...

Global site tag (gtag.js) - Google Analytics