sql中sequence的用法

网上有关“sql中sequence的用法”话题很是火热,小编也是针对sql中sequence的用法寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。

sequence是序列号的意思,每次取的时候它会自动增加。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的值。但是如果你在同一个条SQL语句里面针对同一个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参数:

拥有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence再create。例:

alter sequence SEQ maxvalue 9999999;

alter sequence SEQ cache 10;

在Sql语句中可以使用sequence的地方:

(1)不包含子查询、snapshot、VIEW的 SELECT 语句

(2)INSERT语句的子查询中

(3)INSERT语句的values中

(4)UPDATE 的 SET中

例如:

insert into student(id,name) values(seq.Nextval,'jack');

注意:

第一次NEXTVAL返回的是初始值,随后的NEXTVAL会返回增加后的值。CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,否则报如下错误:

ORA-08002 序列currval尚未在会话中定义。

使用一次NEXTVAL会增加一次 SEQUENCE的值,所以如果你多次执行包含NEXTVAL的一条语句,其值就是不一样的。

删除sequence:drop sequence seq_a;?

当删除sequence后,对应它的同义词会被保留,但是引用时会报错。

oracle为了在rac环境下为了sequence的一致性,使用了三种锁:row cache lock、SQ锁、SV锁。?

row cache lock的目的是在sequence指定nocache的情况下调用sequence.nextval过程中保证序列的顺序性;?

SQ锁是应用于指定了cache+noorder的情况下调用sequence.nextval过程中。?

SV 锁(dfs lock handel) 是调用sequence.nextval期间拥有的锁。前提是创建sequence时指定了

cache 和order属性 (cache+order)。order参数的目的是为了在RAC上节点之间生成sequence的顺序得到保障。

扩展资料:

定义Sequence:定义一个seq_test,最小值为10000,最大值为99999999999999999,从20000开始,增量的步长为1,缓存为20的循环排序Sequence。

定义方法:

create sequence seq_test

minvalue 10000

maxvalue 99999999999999999

start with 20000

increment by 1

cache 20

cycle

order;

DB2的写法:

create sequence seq_test

as bigint

start with 20000

increment by 1

minvalue 10000

maxvalue 99999999999999999

cycle

cache 20

order;

PostgreSQL的写法:

create sequence seq_test

increment by 1

minvalue 10000

maxvalue 99999999999999999

start 20000

cache 20

cycle;

二、Oracle、DB2、PostgreSQL数据库Sequence值的引用参数为:currval、nextval,分别表示当前值和下一个值。下面分别从三个数据库的Sequence中获取nextval的值。

Oracle中:seq_test.nextval

例如:select seq_test.nextval from dual;

DB2中:nextval for SEQ_TOPICMS

例如:values nextval for seq_test;

PostgreSQL中:nextval(seq_test)

例如:select nextval('seq_test');

三、Sequence与indentity的区别与联系

Sequence与indentity的基本作用都差不多。都可以生成自增数字序列。

Sequence是数据库系统中的一个对象,可以在整个数据库中使用,和表没有任何关系;indentity仅仅是指定在表中某一列上,作用范围就是这个表。

四、postgresql中的Sequence分配策略(postgresql8.3.x)

调用select nextval(seq_test);后,系统马上分配一个序号给用户,然后系统的次Sequence马上加上之前设置的步长(increment by 1),不论此序号用户是否使用。

调用select currval(seq_test);返回当前的序列号,该序列号只要没有使用,就不会变化,直到被使用后,才会变化,并且该序列号已经分配给当前请求,不会再分配给其他的请求。

所以,减少浪费时,使用currval,不在乎浪费,而且id不连续的话,可以使用nextval。因为一旦分配给你后,使用失败,将会把该序列号丢弃!

参考资料:

百度百科-sequence

参考资料:

百度百科-结构化查询语言

如何在Oracle中使用Sequence

Oracle提供了sequence对象,由系统提供自增长的序列号,通常用于生成数据库数据记录的自增长主键或序号的地方.

Oracle提供了sequence对象,由系统提供自增长的序列号,通常用于生成数据库数据记录的自增长主键或序号的地方.

下面介绍一下关于sequence 的生成,修改,删除等常用的操作:

1. 创建 Sequence

使用如下命令新建sequence(用户需要有CREATE SEQUENCE 或者CREATE ANY SEQUENCE权限):

CREATE SEQUENCE test_sequence

INCREMENT BY 1-- 每次加的个数据

START WITH 1-- 从1开始计数

NOMAXVALUE -- 不设置最大值

NOCYCLE -- 一直累加,不循环

CACHE 10 ;

[注意]

如果设置了CACHE值,ORACLE将在内存里预先放置一些sequence,以使存取速度更快。cache里面的取完后,oracle自动再取一组到cache。 但是,使用cache可能会跳号, 当遇到数据库突然异常down掉(shutdown abort),cache中的sequence就会丢失.

因此,推荐在create sequence的时候使用 nocache 选项。

2. 使用 sequence:

sequence.CURRVAL -- 返回 sequence的当前值

sequence.NEXTVAL -- 增加sequence的值,然后返回 sequence 值

[注意]

第一次NEXTVAL返回的是初始值;

随后的NEXTVAL会自动增加你定义的INCREMENT BY值,然后返回增加后的值。

CURRVAL 总是返回当前SEQUENCE的值,但是在第一次NEXTVAL初始化之后才能使用CURRVAL,,否则会出错。

一次NEXTVAL会增加一次 SEQUENCE的值,所以如果你在同一个语句里面使用多个NEXTVAL,其值就是不一样的。

sequence 存储在数据字典中,存储于user_sequences表

LAST_NUMBER 为最终序列号,也就是sequence游标当前所在的位置。

//get sequence last_number

SELECT LAST_NUMBER FROM USER_SEQUENCES WHERE SEQUENCE_NAME=TEST_SEQNAME

// NEXTVAL 使游标指向下一位(增一或减一)

SELECT SEQNAME.NEXTVAL FROM USER_SEQUENCES 得到下一位游标的值

3. 修改 Sequence

用户必须拥有ALTER ANY SEQUENCE 权限才能修改sequence. 可以alter除start至以外的所有sequence参数.

如果想要改变start值,必须 drop sequence 再 re-create.

命令格式如下:

ALTER SEQUENCE test_sequence

INCREMENT BY 10

MAXVALUE 10000

CYCLE-- 到10000后从头开始

NOCACHE ;

4. 删除 Sequence

DROP SEQUENCE order_seq;

更多Oracle相关信息见Oracle 专题页面 ?tid=12

给你搜索了一段:

ORACLE SEQUENCE用法

在oracle中sequence就是序号,每次取的时候它会自动增加。sequence与表没有关系。

1、Create Sequence

首先要有CREATE SEQUENCE或者CREATE ANY SEQUENCE权限。

创建语句如下:

CREATE SEQUENCE seqTest

INCREMENT BY 1 -- 每次加几个

START WITH 1 -- 从1开始计数

NOMAXvalue -- 不设置最大值

NOCYCLE -- 一直累加,不循环

CACHE 10; --设置缓存cache个序列,如果系统down掉了或者其它情况将会导致序列不连续,也可以设置为---------NOCACHE

2、得到Sequence值

定义好sequence后,你就可以用currVal,nextVal取得值。

CurrVal:返回 sequence的当前值

NextVal:增加sequence的值,然后返回 增加后sequence值

得到值语句如下:

SELECT Sequence名称.CurrVal FROM DUAL;

如得到上边创建Sequence值的语句为:

select seqtest.currval from dual

在Sql语句中可以使用sequence的地方:

- 不包含子查询、snapshot、VIEW的 SELECT 语句

- INSERT语句的子查询中

- INSERT语句的values中

- UPDATE 的 SET中

如在插入语句中

insert into 表名(id,name)values(seqtest.Nextval,'sequence 插入测试');

注:

- 第一次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防止这种情况。

3、Alter Sequence

拥有ALTER ANY SEQUENCE 权限才能改动sequence. 可以alter除start至以外的所有sequence参数.如果想要改变start值,必须 drop sequence 再 re-create。

例:

alter sequence SEQTEST maxvalue 9999999;

另: SEQUENCE_CACHE_ENTRIES参数,设置能同时被cache的sequence数目。

4、Drop Sequence

DROP SEQUENCE seqTest;

5、一个例子

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,上面的代码就可以实现自动递增的功能了。

注::new 代表 数据改变后的新值,相对应的有 :old 原值

:= 代表 赋值

:nextid表示引用sqlplus中定义的变量

关于“sql中sequence的用法”这个话题的介绍,今天小编就给大家分享完了,如果对你有所帮助请保持对本站的关注!

本文来自作者[寒蕾]投稿,不代表盛龙号立场,如若转载,请注明出处:https://wap.snlon.net/sn/18081.html

(176)

文章推荐

  • 个人公积金怎样转入贷款银行卡上

    网上有关“个人公积金怎样转入贷款银行卡上”话题很是火热,小编也是针对个人公积金怎样转入贷款银行卡上寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。想把个人公积金转入贷款银行卡上,首先缴存公积金的职工要携带本人有效身份证件、银行卡等资料,前往当地公积金管理中心。

    2025年09月25日
    171318
  • 鞋柜定制和鞋柜选购哪个好?

    网上有关“鞋柜定制和鞋柜选购哪个好?”话题很是火热,小编也是针对鞋柜定制和鞋柜选购哪个好?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。在玄关和入口的地方,可能我们会摆放许多的隔断柜子,常见的是鞋柜,不仅可以起到装饰美观的效果,而且这种鞋柜还可以在里面收纳许

    2025年10月13日
    187302
  • msci尾盘调仓第二天怎么走

    网上有关“msci尾盘调仓第二天怎么走”话题很是火热,小编也是针对msci尾盘调仓第二天怎么走寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。1、首先msci尾盘调仓第二天主要原因是因为MSCI指数到了调仓阶段。2、其次所以北向在尾盘最后的集合竞价中存在被动买

    2025年11月13日
    141301
  • 必看教程“微乐浙江麻将万能开挂器”附开挂脚本详细步骤

    您好:微乐浙江麻将万能开挂器这款游戏是可以开挂的,软件加微信【添加图中微信】确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌特别好,总是好牌,而且好像能看到其他人的牌一样。所以很多小伙伴就怀疑这款游戏是不是有挂,实际上这款游戏确实是有挂的,添加客服微信【添加图中微信】安装软件.1.微乐

    2025年11月14日
    121321
  • 安全带固定安全座椅和iso固定有什么区别

    网上有关“安全带固定安全座椅和iso固定有什么区别”话题很是火热,小编也是针对安全带固定安全座椅和iso固定有什么区别寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。安全座椅有三种安装方式,ISO,Latch,安全带固定。?1、安全带连接安全带连接,是指借用汽

    2025年11月17日
    154321
  • 南方一楼装修之前墙壁地面如何防治梅雨季节回潮?

    网上有关“南方一楼装修之前墙壁地面如何防治梅雨季节回潮?”话题很是火热,小编也是针对南方一楼装修之前墙壁地面如何防治梅雨季节回潮?寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。铺上防水材料:在装修的时候,在做一楼的找平层之前先做一层防水层。可以有效隔断外界的

    2025年12月01日
    128310
  • 美国最大的银行

    网上有关“美国最大的银行”话题很是火热,小编也是针对美国最大的银行寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。美国最大银行是叫什么1、美国第一大银行美国美洲银行将其在中国大陆注册的中文名“美国美洲银行”正式更改为“美国银行”。2、从此该行在全球统一使用这一

    2025年12月06日
    116311
  • 对付厚颜无耻的人的方法

    网上有关“对付厚颜无耻的人的方法”话题很是火热,小编也是针对对付厚颜无耻的人的方法寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。恬不知耻拼音:tiánbùzhīchǐ解释:做了坏事满不再乎,一点儿也不感到羞耻。出处:唐·冯贽《云仙杂记》卷八:“倪芳

    2025年12月07日
    132318
  • 辅助神器“手机捕鱼秒杀挂”开挂(透视)辅助教程

    您好:手机捕鱼秒杀挂这款游戏是可以开挂的,软件加微信【添加图中微信】确实是有挂的,很多玩家在这款游戏中打牌都会发现很多用户的牌特别好,总是好牌,而且好像能看到其他人的牌一样。所以很多小伙伴就怀疑这款游戏是不是有挂,实际上这款游戏确实是有挂的,添加客服微信【添加图中微信】安装软件.1.手机捕鱼秒杀

    2025年12月11日
    104319
  • 辅助神器“手机十三水怎么开挂”其实确实有挂

    >亲,手机十三水怎么开挂这款游戏原来确实可以开挂,详细开挂教程1、起手看牌2、随意选牌3、控制牌型4、注明,就是全场,公司软件防封号、防检测、 正版软件、非诚勿扰。2022首推。全网独家,诚信可靠,无效果全额退款,本司推出的多功能作 弊辅助软件。软件

    2025年12月12日
    106305
  • 开挂辅助工具“微乐山东麻将怎么开挂”(免费)开挂辅助教学(最新辅助开挂教程)

    【无需打开直接搜索;操作使用教程:1、界面简单,没有任何广告弹出,只有一个编辑框。2、没有风险,里面的黑科技,一键就能快速透明。3、上手简单,内置详细流程视频教学,新手小白可以快速上手。4、体积小,不占用任何手机内存,运行流畅。微乐家乡麻将免费开挂详细了解请添加《》(加我们微)1、用户打开微乐家乡

    2026年02月08日
    60307
  • 求《假面天使》剧情简介

    网上有关“求《假面天使》剧情简介”话题很是火热,小编也是针对求《假面天使》剧情简介寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够帮助到您。假面天使分集剧情介绍第1集一桩惨绝人寰、养子弑父灭门血案掀起争夺财产家族血腥争斗白手起家欧晋富遭到养子欧永豪痛下毒手身亡玻璃厂

    2026年03月12日
    47306

发表回复

本站作者才能评论

评论列表(3条)

  • 寒蕾的头像
    寒蕾 2025年11月01日

    我是盛龙号的签约作者“寒蕾”

  • 寒蕾
    寒蕾 2025年11月01日

    本文概览:网上有关“sql中sequence的用法”话题很是火热,小编也是针对sql中sequence的用法寻找了一些与之相关的一些信息进行分析,如果能碰巧解决你现在面临的问题,希望能够...

  • 寒蕾
    用户110108 2025年11月01日

    文章不错《sql中sequence的用法》内容很有帮助